node.js JSON.parse reviver不报告重复键?

我正在尝试使用JSONparsing器来检测并保存重复的键。 我在一个reviver中使用了node.js中的JSON.parse(),我希望在获取重复键时告诉我。 但是它不。 有另一种方法吗? 有一个更好的JSONparsing器处理重复或其他参数中的重复键?

"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"} 

JSON.parse()以相同的方式parsingstring,而不pipe你是否提供了一个reviver函数 (换句话说,当一个reviver被传reviver ,它不会切换到“streamparsing器”)。 提供reviver函数只是一个方便,不必自己编写必要的循环。

在npm上有一些stream式JSONparsing器,例如: clarinet , JSONStream和oboe 。 以下是对这些3的一个小testing:

 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' } ] }