发送/解析多个JSON对象

Ken*_*eng 16 javascript sinatra

我有一个Sinatra服务器以流方式从数据库返回多个JSON对象.对象看起来像:

{"a": 1, "b": 2, "c": 3}
{"a": 4, "b": 5, "c": 6}
...
Run Code Online (Sandbox Code Playgroud)

但这是无效的JSON.我可以在Sinatra的事件处理中添加一个hack(手动注入缺少的数组分隔符),使响应看起来像:

[
{"a": 1, "b": 2, "c": 3}
, {"a": 4, "b": 5, "c": 6}
]
Run Code Online (Sandbox Code Playgroud)

现在这是有效的JSON,但这种技术不够优雅.有没有办法做这个客户端?基本上,我想要的是让一个JavaScript函数读取一个字符串并使用一个有效的JSON对象,然后返回给我JSON对象和字符串的其余部分,迭代地调用直到整个字符串被消耗.

Ale*_*min 16

本机JSON.parse()函数期望整个字符串是有效的JSON.我不知道一个解析器只消耗你想要的第一个有效对象.人们应该真的生产有效的JSON.

如果您知道每行有一个对象,则可以使用该split()函数逐行拆分字符串并分别解析每一行.

var str = '{"a": 1, "b": 2, "c": 3}\n'+
          '{"a": 4, "b": 5, "c": 6}';

var strLines = str.split("\n");


for (var i in strLines) {
  var obj = JSON.parse(strLines[i]);
  console.log(obj.a);
}
Run Code Online (Sandbox Code Playgroud)

您还可以使用一些字符串操作将每一行转换为数组元素并解析整个事物.

str = "["+str.replace(/\n/g, ",")+"]";
JSON.parse(str);
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 5

我会这样做:

var str = '{"a": 1, "b": 2, "c": 3}{"a": 4, "b": 5, "c": 6}';

var res = JSON.parse('[' + str.replace(/}{/g, '},{') + ']');
Run Code Online (Sandbox Code Playgroud)

编辑:

作为特雷比评论的奥恩瑟

var str = '{"a": 1, "b": 2, "c": 3}{"a": 4, "b": 5, "c": 6}';

var res = JSON.parse('[' + str.replace(/}{(?=([^"]*"[^"]*")*[^"]*$)/g, '},{') + ']');
Run Code Online (Sandbox Code Playgroud)