如何在浏览器中解析连接的JSON字符串

How To Parse A String Of Concatenated JSON In Browser?

本文关键字:连接 JSON 字符串 浏览器      更新时间:2024-05-21

我正在使用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'}并分别对其进行