2011-09-14 34 views
4

是否有nodejs的解析器可以連接到分塊的JSON(或XML)數據流併發出類似於JSON解析器內置的事件?是否存在用於nodejs的(JSON或XML)流解析器?

例如,我將要解析的流來自HTTP請求到後端服務器。傳入的JSON不能採用特殊的格式。 IOW,nodejs - parsing chunked twitter json中的解決方案對我無效。

+0

只是一個評論,因爲我沒有任何答案具體的答案,但有幾個XML拉解析器使用各種方法來解析流數據,一些谷歌搜索「JSON拉解析器」和類似返回一些看起來很有希望的結果 - 主要是在Java和Cb有趣的語言,但。 –

+0

http://oboejs.com/以流式方式解析JSON。 – 0xcaff

回答

3

我不知道如果我理解你的問題,但我已經使用node-xml之前流,分塊數據。確實有事件被解僱。 sax-js似乎最近活躍,但我不能評論該項目。

我無法對等效的JSON解析器發表評論。

+0

謝謝,正是我正在尋找的節點xml有parseString方法遞交一個接一個。 –

-3

對於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); 
}));