我有以下内容:
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
。
我想念什么?
答案 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