我正在使用Socket.IO将数据移动到浏览器。发送的数据是一个JSON对象流,当它到达浏览器时,它就变成了一个大的JSON字符串。问题是,这个JSON不能被JSON.parse()解析,因为它不是"真正的"JSON。
数据结构可以是任意的,因此RegEx可能无法做到这一点。目前的设置只是暂时的。最终,这个JSON流将在服务器端进行预处理,因此流不需要发送到浏览器,所以我想保留我现在拥有的AJAX/Socket.IO设置,而不是切换到像OboeJS这样的JSON流解析器。
我可以做些什么来解析这个串联的JSON字符串?
为了清晰起见,JSON将如下所示:
{"a":"A"}{"b":"B"}{"c":"C"}
我正试图以这样一种方式解析它,我可以访问它们,比如:
console.log(Object.a) //A
console.log(Object.b) //B
console.log(Object.c) //C
在您的特定情况下,您可以使用Array.prototype.reduce
将所有JSON对象合并为一个:
var unstructuredJson = '{"a":"A"}{"b":"B"}{"c":"C"}';
var jsonArray = "[" + unstructuredJson.split("}{").join("},{") + "]";
var objectArray = JSON.parse(jsonArray);
var result = objectArray.reduce(function(result, item) {
Object.keys(item).forEach(function(propertyName) {
result[propertyName] = item[propertyName];
});
return result;
}, {});
document.body.textContent = JSON.stringify(result);
OP在一些评论中说:
[…]每个JSON可能都有嵌套的数据,如{{}
然后,上述方法在这种情况下被打破。
我的两点是,当你流式传输这些JSON对象时,你应该放一些分隔符,这样生活会更容易:你可以很容易地拆分父对象,你只需要用整个分隔符更改split("}{")
。
我建议你使用一些永远不会发生的字符作为任何财产价值的一部分。你可以在这篇维基百科文章中找到一个控制字符:控制字符
如果每个子字符串都是有效的JSON,但连接的部分不是,则可以将字符串转换为有效的数组文字并使用JSON。parse,然后可以使用array方法处理每个对象,例如forEach:
var s = '{"a":"A"}{"b":"B"}{"c":"C"}';
var obj = JSON.parse('[' + s.replace(/}{/g,'},{') + ']').forEach(function (obj) {
document.write(JSON.stringify(obj) + '<br>');
});
或者,如果你想把它作为一个单一的对象:
var s = '{"a":"A"}{"b":"B"}{"c":"C"}';
var obj = JSON.parse(s.replace(/}{/g,','));
document.write(JSON.stringify(obj));
您可以使用JsonParser来解析连接的json对象:
ObjectMapper mapper = new ObjectMapper();
JsonFactory factory = new JsonFactory(mapper);
JsonParser parser = factory.createParser(YourJsonString);
List<YourObject> YourObjectList = new ArrayList<>();
Iterator<YourObject> iterator = parser.readValuesAs(YourObject.class);
while(iterator.hasNext()) {
YourObject yourObject = iterator.next();
loginSignalsList.add(yourObject);
}
拆分大字符串{a:'A'}{b:'B'}{c:'C'}
并分别对其进行