node.js JSON.parse reviver 不报告重复键?
Posted
技术标签:
【中文标题】node.js JSON.parse reviver 不报告重复键?【英文标题】:node.js JSON.parse reviver doesn't report duplicate keys? 【发布时间】:2015-04-22 20:49:27 【问题描述】:我正在尝试使用 JSON 解析器来检测和保存重复键。我在 node.js 中使用 JSON.parse() 和一个 reviver,我希望当我得到一个重复的密钥时会告诉我。然而事实并非如此。还有其他方法吗?是否有更好的 JSON 解析器来处理 reviver 或其他参数中的重复键?
"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 中的重复键吗?去这里:esdiscuss.org/topic/json-duplicate-keys 【参考方案1】:JSON.parse()
parses the string the same way whether or not you provide a reviver function(换句话说,当reviver
传入时,它不会切换到“流解析器”)。提供reviver
函数只是为了方便,您不必自己编写必要的循环。
在 npm 上有 一些流式 JSON 解析器,例如:clarinet、JSONStream 和 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' ]
【讨论】:
还有其他可用于 javascript 的解析器吗? 这是正确答案。我不明白您为什么要处理 JSON 对象中的重复键,只需修复您发送的内容,因为它不是有效的 JSON。 我知道它不是有效的 JavaScript。某些方面可以接受 JSON。我拼命地反对它,但我的话没有得到理解。我需要更好的词。 在深度嵌套的半结构化文档中查看双簧管的输出让我想吐。啊。回到标准机构。以上是关于node.js JSON.parse reviver 不报告重复键?的主要内容,如果未能解决你的问题,请参考以下文章