将Typescript Map〈string,string>转换为json字符串表示

cld4siwp  于 2023-02-26  发布在  TypeScript
关注(0)|答案(6)|浏览(838)

我在 typescript 中有一个Map<string, string>变量:

let m = Map<string, string>().set('tag', 'v1');

我想转换为json字符串表示:

'{"tag": "v1"}'

我尝试了三种不同的方法。第一种是使用m.toString()。第二种是使用JSON.stringify(m)。两种方法都返回{}。我甚至尝试先将Map转换为javascript object,然后再转换为字符串:

function MapToString(map): string {
  let ro = {};
  Object.keys(map).forEach( key => {
    ro[key] = map[key];
  });
  return JSON.stringify(ro);
}

s = MapToString(m);

当我试图在控制台中打印它时,它也返回了{}

7d7tgy0s

7d7tgy0s1#

可读吗?不,但它能用

JSON.stringify(
  Array.from(
    new Map().set('tag', 'v1').set('foo', 'bar').entries()
  )
  .reduce((o, [key, value]) => { 
    o[key] = value; 

    return o; 
  }, {})
)

就像@james-hay指出的,您有一个输入错误,可能使对象为空

7hiiyaii

7hiiyaii2#

我最终放弃了使用es6 Map,转而使用TSMaptags.toJSON()可以在上面工作。

omqzjyyz

omqzjyyz3#

虽然它没有直接回答您的问题:当我遇到同样的问题时,我重新考虑了Map的使用,选择了普通的JavaScript对象。2因为JSON总是需要字符串作为键,所以Map的一个主要优点(任何类型的键)也就失去了。
Map的另一个优点是允许一个很好的类型签名,比如Map<String, Array<String>>,但是这里TypeScript的“索引签名”为普通JavaScript对象提供了这个签名,甚至允许为键命名:

interface CityLists {
    [postcode: string]: Array<string>
};

这几乎可以像Map一样使用(当然,语法不同),它直接转换为JSON *,即使是嵌套的 *。我认为后者在将对象树转换为JSON时非常重要,在JSON中,Map可以嵌套在其他任意对象和数组的深处。
或者,对于此用例,TypeScript也具有类型Record<K, T>:一个普通的对象,用作类型Map。在上面的例子中,我可以写:

let cityLists: Record<string, Array<string>>;
cityLists["capitals"] = ["Rome", "Paris", "Berlin"];
bmvo0sr5

bmvo0sr54#

在带有lib es2015的Nativescript中,我可以执行以下操作:
从对象到字符串:

// no need to import JSON
let fooInString = JSON.stringify(this.mapObject.subMap);

从字符串到对象:

// no need to import JSON
let fooInObject = JSON.parse(fooInString);

快乐编码!

c9x0cxw0

c9x0cxw05#

很惊讶这一点还没有被提及:

let m = new Map().set('tag', 'v1').set('foo', 'bar')

JSON.stringify(Object.fromEntries(m))

在我看来是最可读的解决方案。

zzzyeukh

zzzyeukh6#

虽然这似乎是一个拼写错误,正如其他答案所指出的,当ES6和vanilla JS在同一个项目中一起使用时,这个问题可能会发生。JS不会识别ES6Map并将其转换为空对象“{}"。
一个快速的解决方法是,在JS对象中持久化ES6Map时使用序列化器/反序列化器
ES6至JS

convertTSMapToJSObj(tsMap) {
    const jsObj = {};
    tsMap.forEach(function (value, key) {
        jsObj[key] = value;
    });
    return jsObj;
}

JS至ES6

convertJSObjToTSMap(jsObj) {
    const tsMap = new Map();
    const arrayOfMapEntries = new Map<any, any>(Object.entries(jsObj);
    for (const [key, value] of arrayOfMapEntries.entries()) {
        tsMap.set(key, value);
    }
    return tsMap;
}

相关问题