我用JavaScript将对象序列化为JSON字符串,
我注意到只有可枚举的对象属性才被序列化:
var a = Object.create(null,{
x: { writable:true, configurable:true, value: "hello",enumerable:false },
y: { writable:true, configurable:true, value: "hello",enumerable:true }
});
document.write(JSON.stringify(a)); //result is {"y":"hello"}
[一个月一次]
我想知道这是为什么,我已经搜索了MDN page和json2解析器文档,但是在任何地方都找不到这种行为的文档。
我怀疑这是使用for... in
循环的结果,for... in
循环只通过enumerable属性(至少在json2
的情况下)。这可能可以通过像Object.getOwnPropertyNames
这样既返回可枚举属性又返回不可枚举属性的东西来完成。尽管这可能会导致序列化问题(由于反序列化)。
- TL;医生**
- 为什么
JSON.stringify
只序列化可枚举属性? - 这种行为是否有记录?
- 我如何自己实现非枚举属性的序列化?
3条答案
按热度按时间p8h8hvxi1#
ES5规范中有规定。
如果Type(值)为Object,且IsCallable(值)为false
那么,我们来看一下JO,相关部分如下:
设K是一个内部字符串列表,由**所有其Enumerable属性为真的值的自身属性的名称组成。字符串的排序应该与Object.keys标准内置函数所使用的排序相同。
svujldwt2#
就像@ThiefMaster上面回答的那样,它在规范中指定了
但是,如果您知道您希望提前序列化的不可枚举属性的名称,则可以通过将replacer函数作为第二个参数传递给JSON.stringify()(MDN文档)来实现,如下所示
qij5mzcb3#
你可以用下面的代码***实现一个包含非枚举项的泛型
JSON.stringify()
,如***所示。copyEnumerable()
是一个值得注意的函数,它本身并没有在内部调用JSON.stringify()
(你可以自己用output对象来调用),主要是因为递归调用JSON.stringify()
(由于嵌套对象)会产生更难看的、不想要的结果。object
和function
类型;我相信这些是唯一需要特殊处理的类型......注意JSArrays
([]
)属于这一类别(对象),以及类(函数),而null
不属于这一类别。由于null
是object
类型,所以我包含了!!
检查。stopRecursiveCopy``Set
只是为了确保它没有做无限递归。JSON.stringify()
调用中添加了两个额外的参数,使其输出的内容格式更美观,便于阅读。代码采用了一种易于在控制台中试用和调整的格式:
其输出:
相关链接: