Javascript 这个JSON.parse reviver函数有什么问题?
我有以下资料:Javascript 这个JSON.parse reviver函数有什么问题?,javascript,json,Javascript,Json,我有以下资料: const白名单=['prop1','prop2','result']; 常量恢复器=(键,值)=>{ if(白名单,包括(关键)){ 返回值; }否则{ return undefined;//显式删除条目 } }; const theMightyJsonString='{“result”:{“prop1”:“问候”,“prop2”:“你好”,“prop3”:“WASSUP!!!!”}'; log(JSON.parse(theMightyJsonString)) console
const白名单=['prop1','prop2','result'];
常量恢复器=(键,值)=>{
if(白名单,包括(关键)){
返回值;
}否则{
return undefined;//显式删除条目
}
};
const theMightyJsonString='{“result”:{“prop1”:“问候”,“prop2”:“你好”,“prop3”:“WASSUP!!!!”}';
log(JSON.parse(theMightyJsonString))
console.log(JSON.parse(theMightyJsonString,reviver))
最后一次调用reviver时将使用一个空字符串作为键“
,这允许您对最终对象应用转换(在您的情况下,您将其转换为未定义的)。如果为空字符串添加测试,则它将正常工作:
const白名单=['prop1','prop2','result'];
常量恢复器=(键,值)=>{
如果(白名单.包括(键)| |键==''){
返回值;
}否则{
return undefined;//显式删除条目
}
};
const theMightyJsonString='{“result”:{“prop1”:“问候”,“prop2”:“你好”,“prop3”:“WASSUP!!!!”}';
log(JSON.parse(theMightyJsonString,reviver))代码>说明:
如果指定了恢复程序
,则通过解析计算的值将在返回之前进行转换。具体而言,计算值及其所有属性(从最嵌套的属性开始,一直到原始值本身)分别通过恢复器运行
“并继续到原始值本身”回答了您的问题。
JSON.parse()
使用键'prop1'
,'prop2'
,'prop3'
及其关联值调用还原程序
,然后使用键'result'
及其值(对象)最后一次使用空字符串作为键
,整个解析对象作为值
文档还提供了问题的解决方案:
如果恢复程序
仅转换某些值而不转换其他值,请确保按原样返回所有未转换的值,否则将从结果对象中删除这些值
您的代码应该如下所示:
const白名单=['prop1','prop2','result'];
常量恢复器=(键,值)=>{
如果(键==''| |白名单。包括(键)){
返回值;
}否则{
return undefined;//显式删除条目
}
};
const theMightyJsonString='{“result”:{“prop1”:“问候”,“prop2”:“你好”,“prop3”:“WASSUP!!!!”}';
log(JSON.parse(theMightyJsonString))
console.log(JSON.parse(theMightyJsonString,revivier))
顶级对象有一个空键(未定义
可能?)白名单。includes(未定义)
将为false
。您正在将整个json obj传递到接收方,因此您将只接收一个带有键“results”的项目,该值是您的其余数据,与您的任何白名单值都不匹配。这是否回答了您的问题?我懂了。我以为最后一个对象被跳过了。实际上,在parse()抛出一个没有花括号的语法错误后,我只添加了周围的花括号来生成一个有效的JSON字符串。()感谢您的回答和代码片段的良好使用。