JSON.parse()无法反序列化包含JSON字符串的数组的最后一个索引

时间:2017-06-29 20:07:59

标签: javascript json

我的string看起来像这样:

{"name":"Bob","age":20}###{"name":"Brian","age":12}###{"name":"Ryan","age":19}

如您所见,它们类似JSON的字符串由###

划分

我的JS代码如下所示:

var data = <above string passed in from a function>
var data_list = data.split('###');          //should return an array with 3 JSON strings

现在我试图像这样单独解析它们:

console.log(JSON.parse(data_list[0]))          // returns [object Object]
console.log(JSON.parse(data_list[1]))          // returns [object Object]

但是,最后一个:

console.log(JSON.parse(data_list[2]))          // Fails               

错误:

Invalid JSON: <json>:28:1 Expected eof but found
}
 ^ in <eval> at line number 28

ALSO:     我从index数组打印出每个data_list的内容,根据jsonlint.com

它们是有效的JSON

4 个答案:

答案 0 :(得分:0)

虽然程序员存在的祸根是引用,即单一与双重以及何时使用,但这里的问题涉及数据的完整性。有人可能会注意到字符串中的数字是不加引号的,但这没关系 - 仍然是有效的JSON;见discussion实际问题源于数据被尾随看不见的空字符所污染。可以使用简单的正则表达式清理数据,如附带的示例所示。

var data = '{"name":"Bob","age":20}###{"name":"Brian","age":12}###{"name":"Ryan","age":19}\u0000\u0000\u0000\u0000';

var clean_data = data.replace(/\u0000/g,"");

var data_list = clean_data.split('###');

console.log(JSON.parse(data_list[0]))     
console.log(JSON.parse(data_list[1]))     
console.log(JSON.parse(data_list[2]))

请参阅此discussion

在接受数据有效之前,无论来源如何,都需要谨慎行事。如果字符串碰巧获取了一个或多个对JSON有害的字符,例如空字符或垂直制表符,则数据会受到损害。人们应该假设数据被污染,直到证明不然。替换任何此类字符的正则表达式有助于确保数据的有效性。这些字符是以unicode表示还是以转义码表示是无关紧要的。重要的是用空字符串替换任何此类事件;见here

答案 1 :(得分:0)

根据Bergi的评论,我能够使用\u0000\u0000\u0000\u0000替换replace(/\0/g, ''),JSON现在有效。谢谢Bergi!

答案 2 :(得分:0)

您可以尝试使用此代码,将该字符串转换为JSON对象数组。

var array = [];
var uniqueString = '[' + data.replaceAll('###', ', ') + ']';
array = JSON.parse(uniqueString);

现在'array'是一个JSON解析对象的数组,所以你应该能够获得这样的东西。

array [0]将为'{"name": "Bob", "age": 20}'

答案 3 :(得分:0)

请检查你的数据字符串,它可能有一些看不见的字符,如@Bergi所说。

我已经通过粘贴您的字符串进行检查。

var sample = '{"name":"Bob","age":20}###{"name":"Brian","age":12}###{"name":"Ryan","age":19}';
var data_str = sample.split('###');
console.log(JSON.parse(data_str[0]));
console.log(JSON.parse(data_str[1]));
console.log(JSON.parse(data_str[2]));

输出在控制台上::

Object {name: "Bob", age: 20}
VM981:4 Object {name: "Brian", age: 12}
VM981:5 Object {name: "Ryan", age: 19}