是否有nodejs的解析器可以連接到分塊的JSON(或XML)數據流併發出類似於JSON解析器內置的事件?是否存在用於nodejs的(JSON或XML)流解析器?
例如,我將要解析的流來自HTTP請求到後端服務器。傳入的JSON不能採用特殊的格式。 IOW,nodejs - parsing chunked twitter json中的解決方案對我無效。
月
是否有nodejs的解析器可以連接到分塊的JSON(或XML)數據流併發出類似於JSON解析器內置的事件?是否存在用於nodejs的(JSON或XML)流解析器?
例如,我將要解析的流來自HTTP請求到後端服務器。傳入的JSON不能採用特殊的格式。 IOW,nodejs - parsing chunked twitter json中的解決方案對我無效。
月
對於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:
變種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);
}));
只是一個評論,因爲我沒有任何答案具體的答案,但有幾個XML拉解析器使用各種方法來解析流數據,一些谷歌搜索「JSON拉解析器」和類似返回一些看起來很有希望的結果 - 主要是在Java和Cb有趣的語言,但。 –
http://oboejs.com/以流式方式解析JSON。 – 0xcaff