【问题标题】:Is there a (JSON or XML) stream parser for nodejs? [closed]nodejs 是否有(JSON 或 XML)流解析器? [关闭]
【发布时间】:2013-01-02 20:18:30
【问题描述】:

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

例如,我将要解析的流来自一个 HTTP 请求到后端服务器。不能为传入的 JSON 假定特殊格式。 IOW,nodejs - parsing chunked twitter json 中的解决方案对我不起作用。

一月

【问题讨论】:

  • 只是评论,因为我没有任何具体的答案,但是有几个 XML 拉解析器使用各种方法来解析流数据,还有一些谷歌搜索“JSON 拉解析器”和类似的返回一些看起来很有希望的结果——不过主要是在 Java 和基于 C 的语言中。
  • oboejs.com 以流的方式解析 JSON。

标签: parsing node.js


【解决方案1】:

我不知道我是否理解您的问题,但我之前使用过node-xml 处理流式分块数据。确实有被触发的事件。 sax-js 似乎最近比较活跃,但我无法评论那个项目。

我无法评论等效的 JSON 解析器。

【讨论】:

  • 谢谢,正是我正在寻找的 node-xml 有 parseString 方法可以一个接一个地处理。
【解决方案2】:
  • node-xml-splitter 可能是关于您的 xml 的答案 流媒体需求
  • jsonpars 可能是关于您的 json 的答案 流媒体需求

【讨论】:

    【解决方案3】:

    对于json,你可以使用下面的sn-p。

    咖啡脚本

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2021-07-21
      相关资源
      最近更新 更多