地图对象的JSON.stringify返回空

时间:2017-10-08 18:14:08

标签: javascript json

    var map1= new Map();
    map1.set("one",1);
    var map2 = new Map();
    map2.set("two",2);
   concatMap = {};
   concatMap['one']= map1;
   concatMap['two']= map2;
 JSON.stringify(concatMap);
  

//输出:" {"一个":{},"两个":{}}"

     

我也尝试过:

concatMap = {};
concatMap.one= map1;
concatMap.two= map2;

为什么我在使用JSON.stringify()时获取空对象而不是map 1和map 2?

5 个答案:

答案 0 :(得分:5)

这是预期的结果。 JSON.stringify无法将Map对象识别为与常规对象不同的内容,并且JSON规范本身无法正确存储Map。它只是将地图视为常规对象,可能包括在其上设置的任何自己的对象属性。



var m = new Map();

// This is not included:
m.set('test', 123);

// This would be included:
m['other'] = 456;

console.log(JSON.stringify(m));




如果您只是使用字符串键,则可以使用常规对象而不是Map。

答案 1 :(得分:1)

您可以使用

const newMap = JSON.parse('{}');
newMap[name] = value;

并控制newMap。结果是pars为Map

答案 2 :(得分:1)

感谢 Tim Brown 在他关于该主题的 blog post - 当 Map 对象的内容可序列化时,您可以这样做:

  1. 将映射序列化为 JSON:

    JSON.stringify(Array.from(map.entries()))

  2. 将 JSON 反序列化为 Map:

    new Map(JSON.parse(jsonStr))

答案 3 :(得分:0)

您可以使用map1 = {"one", 1}代替地图对象。

以下是工作人员:https://plnkr.co/edit/mUP5KbTVCo0JgdlqH1qQ?p=preview

答案 4 :(得分:0)

正如其他人所说,JSON尚未支持地图。但是2d数组是可以做到的:

const map1= new Map().set("one",1),
           map2 = new Map().set("two",2),
           concatMap = {
              one:[...map1],
              two:[...map2]
           };

const result = JSON.stringify(concatMap);

要解析它,请执行:

 let {one,two} = JSON.parse(result);
 one = new Map(one),
 two = new Map(two);