【发布时间】:2018-08-11 18:11:52
【问题描述】:
JSON.parse 将序列化的 Json 作为参数并反序列化它。第二个(可选)参数是一个 reviver 函数,它采用键和值并返回反序列化对象中的替换值。记录在案的行为是,如果 reviver 返回未定义或不返回任何内容,则相关属性将从生成的反序列化对象中省略。
我有一种情况,我希望相关属性包含在结果反序列化对象中,值为 undefined。
因此,例如,以下是当前正确的:
JSON.parse(JSON.stringify({a: 1, b:2}), (k, v) => v===2 ? undefined : v);
// result of this is {a:1}, as is documented/expected.
但如果我真的想要结果是什么
{a:1, b:undefined}
有没有办法写reviver来做到这一点?
我特别不想在反序列化后再次遍历对象,所以请不要建议将其作为解决方案。另外我特别不希望将 b 设置为空。我真的希望它以未定义值的属性的形式出现。
这可能根本不可能,但我希望有人有一个好主意!
第一次编辑:
第一个建议是很好的尝试,但我还需要它在深层结构中工作,所以如下:
JSON.parse(JSON.stringify({
a: 1,
b:{
c: 1,
d: 2,
e: [
1,
2,
{
f: 1,
g: 2
},
4
]
}
}), (k, v) => v===2 ? undefined : v);
应该在我的理想世界中产生:
{
a: 1,
b:{
c: 1,
d: undefined,
e: [
1,
undefined,
{
f: 1,
g: undefined
},
4
]
}
}
【问题讨论】:
-
改用
null。 -
谢谢,但我已经在问题中明确表示不能工作。
-
啊,我读多了。通常
null或只是一个未定义的属性(访问时以undefined结尾)就足够了。
标签: javascript json deserialization json-deserialization