1

重複キーを検出して保存する JSON パーサーを使用しようとしています。node.js で JSON.parse() をリバイバーと共に使用しています。重複キーを取得したときに教えてくれることを期待しています。しかし、そうではありません。別の方法はありますか?リバイバーまたはその他の引数で重複キーを処理する、より優れた JSON パーサーはありますか?

"use strict";

try {
    var content = '{"value": "a", "value": "b", "value": "c" }';
    console.log(content);
    var parsed = JSON.parse(content, function(k, v) {
        console.log(k+"="+JSON.stringify(v));
        return v;
    });
} catch (e) {
    console.log(e);
}

出力は次のとおりです。

{"value": "a", "value": "b", "value": "c" }
value="c"
={"value":"c"}
4

1 に答える 1

3

JSON.parse()reviver 関数を提供するかどうかに関係なく、同じ方法で文字列を解析しますreviver(つまり、 aが渡されたときに「ストリーミング パーサー」に切り替わりません)。関数を提供するreviverことは、必要なループを自分で作成する必要がないようにするための便利な方法です。

npmにいくつかのストリーミング JSON パーサーがあります。たとえば、 clarinetJSONStream、およびoboeです。これら3つの小さなテストは次のとおりです。

var clarinet = require('clarinet').parser();
var JSONStream = require('JSONStream').parse('*', function (value, path) {
  return { key: path[path.length - 1], value: value, path: path }
});
var rs = new (require('stream').Readable)();
rs._read = function(n) {};
var oboe = require('oboe')(rs);

var content = '{"value": "a", "value": "b", "value": "c" }';

clarinet.onopenobject = clarinet.onkey = function(k) {
  console.log('clarinet key =', k);
};
clarinet.onvalue = function(v) {
  console.log('clarinet value =', v);
};
clarinet.write(content).close();

JSONStream.on('data', function(d) {
  console.log('JSONStream data:', arguments);
}).end(content);

oboe.on('node:*', function(n) {
  console.log('oboe node:', arguments);
});
rs.push(content);
rs.push(null);

// output:
// clarinet key = value
// clarinet value = a
// clarinet key = value
// clarinet value = b
// clarinet key = value
// clarinet value = c
// JSONStream data: { '0': { key: 'value', value: 'a', path: [ 'value' ] } }
// JSONStream data: { '0': { key: 'value', value: 'b', path: [ 'value' ] } }
// JSONStream data: { '0': { key: 'value', value: 'c', path: [ 'value' ] } }
// oboe node: { '0': 'a', '1': [ 'value' ], '2': [ { value: 'a' }, 'a' ] }
// oboe node: { '0': 'b', '1': [ 'value' ], '2': [ { value: 'b' }, 'b' ] }
// oboe node: { '0': 'c', '1': [ 'value' ], '2': [ { value: 'c' }, 'c' ] }
// oboe node: { '0': { value: 'c' }, '1': [], '2': [ { value: 'c' } ] }
于 2015-02-21T02:52:10.170 に答える