2011-09-14 12 views
4

そこにチャンクされたJSON(またはXML)データのストリームに接続できるnodejのパーサーがあり、JSONパーサーの組み込み方法と同様のイベントが発生しますか?nodejの(JSONまたはXML)ストリームパーサーはありますか?

私が解析しようとしているストリームは、HTTPリクエストから例えばバックエンドサーバーに送られています。着信JSONには特別な書式設定はありません。 IOW、nodejs - parsing chunked twitter jsonの解は私には役に立たない。

+0

を必要とする関係の答えかもしれない可能性があり具体的な回答がありますが、ストリームデータを解析するためにさまざまな方法を使用するXMLプルパーサーがいくつかあります。また、「JSONプルパーサー」などのGoogle検索では、JavaやCbを中心とした有望な結果しかしased言語、しかし。 –

+0

http://oboejs.com/ JSONをストリーミング方式で解析します。 – 0xcaff

答えて

3

私はあなたの質問を理解している場合、私は知らないが、ストリーミングで、私は前にnode-xmlを使用しているが、データをチャンク。確かに解雇される出来事があります。 sax-jsは最近アクティブに見えますが、そのプロジェクトにはコメントできません。

相当するJSONパーサーにはコメントできません。

+0

ありがとう、ちょうど私が探していたnode-xmlには、別のチャンクを1つのチャンクに渡す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:

の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); 
})); 
1
  • node-xml-splitterは、XML ストリーミングが
  • jsonparsを必要に関する答えは私がいずれかを持っていないので、あなたのJSON ストリーミングは、ちょうどコメント
関連する問題