对象的 JSON 对象流"/>
如何读取每个对象的 JSON 对象流
我有一个二进制应用程序,它生成连续的 json 对象流(不是 json 对象数组)。 Json 对象有时可以跨越多行(仍然是一个有效的 json 对象,但经过了美化)。
我可以连接到这个流并毫无问题地阅读它:
var child = require('child_process').spawn('binary', ['arg','arg']);
child.stdout.on('data', data => {
console.log(data);
});
Streams 是缓冲区并在需要时发出数据事件,因此我使用了 readline 模块以将缓冲区解析为行并且它适用于(我能够 JSON.parse() 行)对于不支持的 Json 对象跨多行。
最佳解决方案是监听返回单个 json 对象的事件,例如:
child.on('json', object => {
});
我注意到流节点文档中的 objectMode 选项,但是我得到的是缓冲区格式的流,所以我相信我无法使用它。
在 pixl-json-stream、json-stream 查看了 npm,但在我看来这些都不符合目的。有 clarinet-object-stream 但它需要根据事件从头开始构建 json 对象。
我无法控制 json 对象流,大多数时候一个对象在一行上,但是 10-20% 的时间 json 对象在多行上( 作为 EOL),对象之间没有分隔符。每个新对象总是从新的一行开始。
样本流:
{ "a": "a", "b":"b" }
{ "a": "x",
"b": "y", "c": "z"
}
{ "a": "a", "b":"b" }
必须已经有一个解决方案我只是遗漏了一些明显的东西。宁愿找到合适的模块然后用正则表达式破解流解析器来处理这种情况。
回答如下:我建议尝试解析每一行:
const readline = require('readline');
const rl = readline.createInterface({
input: child.stdout
});
var tmp = ''
rl.on('line', function(line) {
tmp += line
try {
var obj = JSON.parse(tmp)
child.emit('json', obj)
tmp = ''
} catch(_) {
// JSON.parse may fail if JSON is not complete yet
}
})
child.on('json', function(obj) {
console.log(obj)
})
因为孩子是一个 EventEmitter,所以可以调用 child.emit('json', obj)。
更多推荐
如何读取每个对象的 JSON 对象流
发布评论