我正在使用Socket.IO将数据移动到浏览器。发送的数据是JSON对象的流,当它到达浏览器时,它变成一个大的JSON字符串。问题是,这个JSON无法被JSON.parse()解析,因为它不是“真正的”JSON。
数据结构可以是任意的,因此RegEx可能无法解决问题。而目前的设置只是暂时的。最终这个JSON流将在服务器端进行预处理,因此不需要将流发送到浏览器,因此我想保留我现在拥有的AJAX / Socket.IO设置,而不是切换到JSON流解析器,如OboeJS。
我该怎么做才能解析这个连接的JSON字符串?
为清楚起见,JSON将如下所示:
{"a":"A"}{"b":"B"}{"c":"C"}
我试图以这样的方式解析它:我可以像以下一样访问它们:
console.log(Object.a) //A
console.log(Object.b) //B
console.log(Object.c) //C
答案 0 :(得分:2)
在您的特定情况下,您可以使用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("}{")
整个分隔符。
我建议你使用一些永远不会作为任何属性值的一部分发生的角色。您可以在此维基百科文章中找到控制角色:Control character
答案 1 :(得分:0)
如果每个子字符串都是有效的JSON但是连接的部分不是,那么您可以将字符串转换为有效的数组文字并使用 JSON.parse ,然后您可以使用数组处理每个对象方法,例如的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>');
});
&#13;
或者如果您想将它作为单个对象:
var s = '{"a":"A"}{"b":"B"}{"c":"C"}';
var obj = JSON.parse(s.replace(/}{/g,','));
document.write(JSON.stringify(obj));
&#13;
答案 2 :(得分:0)
您可以使用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);
}
答案 3 :(得分:-2)
拆分大字符串{a:'A'}{b:'B'}{c:'C'}
并单独解析它们