JSON.parse处理非标准Json数据出错的解决

yizhihongxing

当我们使用JSON.parse()解析JSON格式的数据时,如果数据格式非标准的话,就有可能会出现报错现象。

例如我们有一个非标准的JSON格式数据如下:

{
  name: "Tom",
  age: 28
}

使用JSON.parse()时会报错,错误信息如下:

Uncaught SyntaxError: Unexpected token n in JSON at position 4

这是因为非标准的JSON格式中,属性名称必须使用双引号""包裹。

解决方法

我们可以通过使用try catch来捕获这个错误,然后手动进行属性名称处理。

let data = '{ name: "Tom", age: 28 }';
try {
  data = JSON.parse(data);
} catch (e) {
  data = data.replace(/([\w]+)\s*:/g, function (match, p1) {
    return `"${p1}":`;
  });
  data = JSON.parse(data);
}
console.log(data); // { name: "Tom", age: 28 }

上述解决方法中,我们使用了正则表达式来处理非标准JSON格式中的属性名称,将属性名称包裹在双引号中后,再使用JSON.parse()进行解析。

另外一个示例,假设我们有如下非标准的JSON格式数据:

{ name: "Tom", age: 28, friends: { name: "Jerry", age: 27 } }

使用JSON.parse()时也会出错:

Uncaught SyntaxError: Unexpected token n in JSON at position 5

这是因为非标准的JSON格式中,对象属性名称也必须使用双引号包裹。

解决方法

我们可以通过递归进行处理,将非标准JSON格式转化为标准的JSON格式以后再解析。

function parseNonStandardJson(str) {
  let result = str.replace(/([\w]+)\s*:/g, function (match, p1) {
    return `"${p1}":`;
  });
  result = result.replace(/'/g, '"');
  if (result.indexOf('{') == 0) {
    result = `[${result}]`;
    result = JSON.parse(result);
    return result[0];
  } else {
    return JSON.parse(result);
  }
}

let data = '{ name: "Tom", age: 28, friends: { name: "Jerry", age: 27 } }';
let parsedData = parseNonStandardJson(data);
console.log(parsedData); // { name: "Tom", age: 28, friends: { name: "Jerry", age: 27 } }

上述解决方法中,我们先使用正则表达式将非标准JSON格式中的属性名称包裹在双引号中,将单引号转化为双引号。然后通过判断字符串首尾是否为大括号(即是否为一个对象),来决定使用JSON.parse()还是转化为一个数组再使用JSON.parse()。使用递归对子对象进行处理,最终得到标准的JSON格式对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSON.parse处理非标准Json数据出错的解决 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 对vue下点击事件传参和不传参的区别详解

    对Vue下点击事件传参和不传参的区别详解,主要涉及了在Vue模板中绑定事件并传递参数的方法。 不传参的情况 当我们在Vue模板中绑定一个事件时,如果没有传递任何参数,vue会通过默认的方式将事件对象event传递进去。示例如下: <template> <button @click="handleClick">不传参…

    JavaScript 2023年6月11日
    00
  • JavaScript自定义事件介绍

    以下是JavaScript自定义事件的详细介绍: 什么是JavaScript自定义事件? 在JavaScript中,自定义事件是指可以自定义触发和监听的事件,以便根据需要执行某些操作。 如何定义自定义事件? 我们可以使用原生JavaScript或者第三方库(例如jQuery)来定义自定义事件。以下是几种定义自定义事件的方式: 1. 使用Event对象 con…

    JavaScript 2023年6月10日
    00
  • JavaScript Object.defineProperty与proxy代理模式的使用详细分析

    针对这个主题,我可以提供如下的详细讲解攻略: JavaScript Object.defineProperty与proxy代理模式的使用详细分析 1. JavaScript Object.defineProperty 1.1 概述 JavaScript中的Object.defineProperty方法可以用于精确地对属性进行定义和控制,是一个非常强大的工具。…

    JavaScript 2023年5月27日
    00
  • 一文总结JavaScript中常见的设计模式

    一文总结JavaScript中常见的设计模式 什么是设计模式? 设计模式是一种被广泛应用于软件开发中的经验总结。它是针对某种常见问题,经过反复实践并总结出的最优解决方案,具有高重用性、可维护性等优点,被广泛应用于软件开发中。 JavaScript中常见的设计模式 在JavaScript中,常见的设计模式包括: 工厂模式 工厂模式是一种通过工厂函数来创建对象的…

    JavaScript 2023年5月19日
    00
  • Vue模仿ElementUI的form表单实例代码

    下面是针对“Vue模仿ElementUI的form表单实例代码”的详细攻略。 1. 概述 在实际的开发中,我们经常需要使用到表单组件。在Vue框架中,我们可以借助ElementUI提供的form表单组件快速开发表单。但是,有时候我们想要自己定制化一些表单组件,或者ElementUI提供的表单组件不够满足我们的需求时,就需要自己动手写表单组件了。 本攻略就是从…

    JavaScript 2023年6月10日
    00
  • js每隔两秒输出数组中的一项(实例)

    下面是讲解“js每隔两秒输出数组中的一项”的完整攻略,具体步骤如下: 1. 准备工作 在开始实现之前,我们需要明确几个问题: 哪个数组需要输出? 如何输出数组中的一项? 如何达到每隔两秒输出一项的效果? 针对以上问题,我们可以做如下解答: 这里假设我们要输出的数组是一个长度为n的一维数组 输出数组中的一项可以使用数组索引,即array[index]的形式来实…

    JavaScript 2023年5月27日
    00
  • 详解javascript的变量与标识符

    我们来详细讲解JavaScript的变量与标识符。 变量 在JavaScript中,变量是用于存储数据的容器,它们可以被任何地方引用或更改。在使用变量之前,需要先声明它们,以告诉JavaScript编译器它们的类型。 声明变量有三种方式: 使用var关键字 var name = ‘张三’; 使用let关键字(ES6新增) let age = 20; 使用co…

    JavaScript 2023年5月18日
    00
  • asp+jsp+JavaScript动态实现添加数据行

    为了实现添加数据行,我们需要使用以下技术: ASP:一种用于创建动态Web应用程序的服务器端脚本技术; JSP:一种用于创建动态Web应用程序的服务器端脚本技术; JavaScript:一种用于在网页中添加交互和动态效果的编程语言。 下面是实现添加数据行的详细攻略: 创建一个HTML页面。在页面中,添加一个表格元素,并为其添加表头和一个空的表体: <h…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部