有没有(JSON或XML)streamparsing器nodejs?

是否有nodejs的parsing器,可以连接到分块的JSON(或XML)数据stream,并将发出类似于内置JSONparsing器的事件?

例如,我将要parsing的stream来自HTTP请求到后端服务器。 传入的JSON不能采用特殊的格式。 IOW, nodejs中的解决scheme- parsing分块的twitter json将不适用于我。

一月

我不知道如果我理解你的问题,但我已经使用节点xml之前stream式分块的数据。 确实有事情被解雇。 sax-js似乎更近一些活跃,但我不能评论这个项目。

我无法对等效的JSONparsing器发表评论。

  • node-xml-splitter可能是一个关于你的xmlstream需求的答案
  • jsonpars可能是一个关于你的jsonstream媒体需求的答案

对于json,你可以使用下面的代码片断。

CoffeeScript的

make_parser = (callback)-> state_parse=0 level=0 buffer=0 parse_out = (data)-> m = data.match /[{}"]/ if m? c = m[0] buffer += data[..m.index] remaining = data[m.index+1..] if c == "}" level -= 1 if level == 0 callback JSON.parse(buffer) init_state() else if c == "{" level += 1 else if c == '"' state_parse = parse_string state_parse remaining else buffer += data parse_string = (data)-> m = data.match /["\\]/ if m? c = m[0] buffer += data[..m.index] remaining = data[m.index+1..] transition = '\\': parse_special '\"': parse_out state_parse = transition[c] state_parse remaining else buffer += data parse_special = (data)-> if data.length > 0 buffer += data[0] state_parse = parse_string state_parse data[1..] init_state =-> state_parse = parse_out level = 0 buffer = "" init_state() (data)-> state_parse data fs = require "fs" s = fs.createReadStream "somefile.json" s.setEncoding 'utf8' s.on "data", make_parser (d)-> console.log "-----" console.log d 

JavaScript的:

var fs,make_parser,s;

 make_parser = function(callback) { var buffer, init_state, level, parse_out, parse_special, parse_string, state_parse; state_parse = 0; level = 0; buffer = 0; parse_out = function(data) { var c, m, remaining; m = data.match(/[{}"]/); if (m != null) { c = m[0]; buffer += data.slice(0, m.index + 1 || 9e9); remaining = data.slice(m.index + 1); if (c === "}") { level -= 1; if (level === 0) { callback(JSON.parse(buffer)); init_state(); } } else if (c === "{") { level += 1; } else if (c === '"') { state_parse = parse_string; } return state_parse(remaining); } else { return buffer += data; } }; parse_string = function(data) { var c, m, remaining, transition; m = data.match(/["\\]/); if (m != null) { c = m[0]; buffer += data.slice(0, m.index + 1 || 9e9); remaining = data.slice(m.index + 1); transition = { '\\': parse_special, '\"': parse_out }; state_parse = transition[c]; return state_parse(remaining); } else { return buffer += data; } }; parse_special = function(data) { if (data.length > 0) { buffer += data[0]; state_parse = parse_string; return state_parse(data.slice(1)); } }; init_state = function() { state_parse = parse_out; level = 0; return buffer = ""; }; init_state(); return function(data) { return state_parse(data); }; }; fs = require("fs"); s = fs.createReadStream("somefile.json"); s.setEncoding('utf8'); s.on("data", make_parser(function(d) { console.log("-----"); return console.log(d); }));