Javascript 除了Set和Map之外,还有哪些常见的JS类不能很好地处理JSON.stringify()?
在地图或集合上调用JSON.stringify时,会得到空数据:Javascript 除了Set和Map之外,还有哪些常见的JS类不能很好地处理JSON.stringify()?,javascript,node.js,ecmascript-6,Javascript,Node.js,Ecmascript 6,在地图或集合上调用JSON.stringify时,会得到空数据: console.log(JSON.stringify({foo: new Map([[1,2], [3,4]])})); 我们刚刚得到: {"foo":{}} 我可以使用以下方法或多或少地解决上述问题: console.log(JSON.stringify({foo: Array.from(new Map([[1,2], [3,4]]))})); 但我的问题是——除了Map和Set之外,还有其他核心JS类不能自动序列化吗?J
console.log(JSON.stringify({foo: new Map([[1,2], [3,4]])}));
我们刚刚得到:
{"foo":{}}
我可以使用以下方法或多或少地解决上述问题:
console.log(JSON.stringify({foo: Array.from(new Map([[1,2], [3,4]]))}));
但我的问题是——除了Map和Set之外,还有其他核心JS类不能自动序列化吗?JSON只支持:字符串、数字、布尔值、null和数组以及作为值/属性的普通对象。就这样。因此,除了JSON直接支持的对象之外,没有其他类型的对象由其他对象组成 您必须手动将对象转换为可以用JSON中的这些基本类型表示的对象,或者找到其他方法来表示对象。对象(如具有简单值/索引的映射)中的数据可以手动转换为JSON格式(可能是在对象数组或数组数组中),但在反序列化时必须手动将其转换回映射 您可以在这里看到JSON支持的类型: 这意味着没有自定义对象类型,即使其实例数据仅由上述类型组成,也不会反序列化为正确的对象类型。这甚至包括
日期
或正则表达式
之类的对象,当然也包括任何非普通对象,如集合
,或映射
可以手动将数据转换为JSON可序列化的内容,然后手动反序列化为适当的对象。例如,可以序列化非嵌套的映射
和集
,该映射只包含以下合法键和值:
function serialize(mapOrSet) {
if (mapOrSet instanceof Map) {
// convert Map into 2D array
// [[key1, val1], [key2, val2], ....]
let data = [];
for (const [key, value] of mapOrSet) {
data.push([key, value]);
}
return JSON.stringify({
_customType: "Map",
_data: data
});
} else if (mapOrSet instanceof Set) {
return JSON.stringify({
_customType: "Set",
_data: Array.from(mapOrSet);
});
} else {
throw new TypeError("argument to serialize() must be Map or Set");
}
}
然后,您必须拥有一个自定义反序列化程序,该程序可以检测具有
\u customType
属性的对象,并调用适当的反序列化程序函数将普通JSON转换为适当的自定义对象类型。您甚至可以通过让对象支持它们自己的序列化和反序列化功能,使用某种\u customType
属性来标识要调用的适当类名,从而使系统具有可扩展性。当然,源和目标都必须有适当的序列化和反序列化扩展才能正常工作。Date对象浮现在脑海中。和符号。是的,但它们没有任何特殊的表现方式;它们只是JSON输出中的字符串,因此当你解析JSON时,你仍然只有字符串。似乎问题的区别在于产生有用JSON序列化的类与无用JSON序列化的类。由此可知:Date
s,functions,undefined
,Infinity
,RegExps,map,set,blob,filelist,ImageData、稀疏数组、类型化数组和其他复杂类型。是的,这就是我所说的接收器需要知道如何将其转换回的意思。JSON的大部分价值在于自动转换为语言类型。