如果你为你拥有toJSON()
的任何class
对象实现你自己的函数,那么就可以正常JSON.stringify()
工作!
Map
s 与Array
s 键?Map
s 与其他Map
作为值?一个Map
里面一个普通的Object
?甚至可能是您自己的自定义类;简单。
Map.prototype.toJSON = function() {
return Array.from(this.entries());
};
而已!
这里需要原型操作。您可以toJSON()
手动添加所有非标准内容,但实际上您只是在避免使用 JS 的功能
演示
test = {
regular : 'object',
map : new Map([
[['array', 'key'], 7],
['stringKey' , new Map([
['innerMap' , 'supported'],
['anotherValue', 8]
])]
])
};
console.log(JSON.stringify(test));
输出:
{"regular":"object","map":[[["array","key"],7],["stringKey",[["innerMap","supported"],["anotherValue",8]]]]}
不过,反序列化一直到真正的Map
s 并不是自动的。使用上述结果字符串,我将重新制作地图以提取一个值:
test2 = JSON.parse(JSON.stringify(test));
console.log((new Map((new Map(test2.map)).get('stringKey'))).get('innerMap'));
输出
"supported"
这有点混乱,但是使用一点魔法酱, 您也可以使反序列化自动化。
Map.prototype.toJSON = function() {
return ['window.Map', Array.from(this.entries())];
};
Map.fromJSON = function(key, value) {
return (value instanceof Array && value[0] == 'window.Map') ?
new Map(value[1]) :
value
;
};
现在 JSON 是
{"regular":"object","test":["window.Map",[[["array","key"],7],["stringKey",["window.Map",[["innerMap","supported"],["anotherValue",8]]]]]]}
我们的反序列化和使用非常简单 Map.fromJSON
test2 = JSON.parse(JSON.stringify(test), Map.fromJSON);
console.log(test2.map.get('stringKey').get('innerMap'));
输出(并且没有new Map()
使用)
"supported"
演示