如何在浏览器中解析串联的JSON字符串?

时间:2016-04-13 05:51:36

标签: javascript json parsing stream frontend

我正在使用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

4 个答案:

答案 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;
&#13;
&#13;

或者如果您想将它作为单个对象:

&#13;
&#13;
var s = '{"a":"A"}{"b":"B"}{"c":"C"}';
var obj = JSON.parse(s.replace(/}{/g,','));

document.write(JSON.stringify(obj));
&#13;
&#13;
&#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'}并单独解析它们