这个JSON.parse Reviver函数有什么问题?

时间:2019-03-06 00:01:58

标签: javascript json

我有以下内容:

const whitelist = ['prop1', 'prop2', 'result'];
const reviver = (key, value) => {
  if (whitelist.includes(key)) {
    return value;
  } else {
    return undefined; // explicitly delete the entry
  }
};

const theMightyJsonString = '{ "result": { "prop1": "Greetings", "prop2": "Hello", "prop3": "WASSUP!!!!" } }';

console.log(JSON.parse(theMightyJsonString))
console.log(JSON.parse(theMightyJsonString, reviver))

现在,我可以成功地JSON.parse(theMightyJsonString)进入对象了,但是如果像这样JSON.parse(theMightyJsonString, reviver)传递齐齐器,则结果是undefined

我想念什么?

2 个答案:

答案 0 :(得分:3)

最后一次调用reviver时将使用一个空字符串作为键"",它允许您将转换应用于最终对象(在您的情况下,您将其转换为undefined )。如果您为空字符串添加测试,那么它将正常工作:

const whitelist = ['prop1', 'prop2', 'result'];
const reviver = (key, value) => {
  if (whitelist.includes(key) || key === '') {
    return value;
  } else {
    return undefined; // explicitly delete the entry
  }
};

const theMightyJsonString = '{ "result": { "prop1": "Greetings", "prop2": "Hello", "prop3": "WASSUP!!!!" } }';

console.log( JSON.parse( theMightyJsonString, reviver ) );

答案 1 :(得分:0)

documentation of JSON.parse()解释:

  

如果指定了reviver,则通过解析计算的值将在返回之前进行转换。具体来说,计算的值及其所有属性(从嵌套最多的属性开始,一直到原始值本身)分别通过reviver运行。

“并继续使用原始值本身”回答了您的问题。
JSON.parse()用键reviver'prop1',{{ 1}}及其相关值,然后使用键'prop2'及其值(一个对象),最后一次使用空字符串作为'prop3',将整个已解析的对象作为'result'

文档还为您的问题提供了解决方案:

  

如果key仅转换某些值,而不转换其他值,请确保按原样返回所有未转换的值,否则它们将从结果对象中删除。

您的代码应如下所示:

value