我有一个 Sinatra 服务器,它以流方式从数据库返回多个 JSON 对象。对象看起来像:
{"a": 1, "b": 2, "c": 3}
{"a": 4, "b": 5, "c": 6}
...
但这是无效的 JSON。我可以在 Sinatra 的事件处理中添加一个 hack(手动注入(inject)丢失的数组定界符)以使响应看起来像:
[
{"a": 1, "b": 2, "c": 3}
, {"a": 4, "b": 5, "c": 6}
]
现在是有效的 JSON,但这种技术不够优雅。有什么方法可以做这个客户端吗?基本上,我想要的是让一个 JavaScript 函数读取一个字符串并使用一个有效的 JSON 对象,然后将 JSON 对象和字符串的其余部分返回给我,反复调用直到整个字符串被使用。
最佳答案
原生 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);
}
您还可以使用一些字符串操作将每一行转换为一个数组元素并解析整个元素。
str = "["+str.replace(/\n/g, ",")+"]";
JSON.parse(str);
关于javascript - 发送/解析多个 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4209527/