2011-09-14 2 views
4

거기에 청크로 묶인 JSON (또는 XML) 데이터 스트림에 연결할 수있는 nodejs 파서가 있으며 JSON 파서가 내장 된 방식과 비슷한 이벤트를 내 보냅니다.nodej에 대한 (JSON 또는 XML) 스트림 구문 분석기가 있습니까?

예를 들어 HTTP 요청에서 파싱 할 스트림이 나옵니다. 들어오는 JSON에 대해 특별한 형식을 지정할 수 없습니다. IOW, nodejs - parsing chunked twitter json의 해결책은 나를 위해 작동하지 않습니다.

+0

을 필요로하여 JSON에 관한 해답이 될 수 필요가 당신의 XML 스트리밍에 관한 해답이 될 수 구체적인 답변을 제공하지만 스트림 데이터를 구문 분석하는 데 다양한 방법을 사용하는 여러 XML 끌어 오기 구문 분석기가 있으며 "JSON 끌어 오기 구문 분석기"및 유사한 일부 유망한 결과 (대부분 Java 및 Cb)에 대한 일부 Google 검색 결과 하지만 ased 언어. –

+0

http://oboejs.com/ JSON을 스트리밍 방식으로 파싱합니다. – 0xcaff

답변

3

나는 당신의 질문을 이해하면 나도 몰라,하지만 스트리밍과 내가 전에 node-xml을 사용하고는, 데이터를 청크. 참으로 해고되는 사건들이 있습니다. sax-js은 최근에 활성화 된 것으로 보이지만 그 프로젝트에 대해서는 언급 할 수 없습니다.

동등한 JSON 구문 분석기에 대해서는 언급 할 수 없습니다.

+0

고마워, 그냥 node-xml을 찾으려면 parseString 메서드가 필요하다. –

-3

json의 경우 다음 스 니펫을 사용할 수 있습니다.

커피 스크립트

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 

자바 스크립트 :

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); 
})); 
관련 문제