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 不报告重复键?的主要内容,如果未能解决你的问题,请参考以下文章

json parse 解析js function

JSON.parse() 与 JSON.stringify()

JSON.parse() 方法解析一个JSON字符串

JSON.parse()

Json.parse()

JSON.parse()