当我们使用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技术站