我的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
答案 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}