将Typescript Map <string,string =“”>转换为json字符串表示形式

时间:2017-09-06 03:31:11

标签: javascript json typescript

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

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

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

'{"tag": "v1"}'

我尝试了3种不同的方法。首先是使用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);

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

6 个答案:

答案 0 :(得分:7)

可读?不,但它有效

<img class="test" alt="My background image">

就像@ james-hay指出的那样,你有一个错字,可能会使对象变空

答案 1 :(得分:4)

我最终放弃了使用es6地图并切换到tags.toJSON(),其中List<int>正常工作。

答案 2 :(得分:0)

尽管它不能直接回答您的问题:遇到问题时,我会重新考虑使用Map并使用普通的JavaScript对象。由于JSON始终需要字符串作为键,因此Map的主要优势之一(任何类型的键)都将丢失。

Map的另一个优点是它们允许使用不错的类型签名,例如Map<String, Array<String>>。但是在这里,TypeScript的“索引签名”正是为普通的JavaScript对象提供了此功能,甚至允许键名:

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

这几乎可以像Map一样使用(当然使用不同的语法),即使嵌套,它也可以直接转换为JSON 。我认为当您将对象树转换为JSON时,后者非常重要,在JSON中,地图可以嵌套在其他任意对象和数组的深处。

或者,对于该用例,TypeScript也具有类型Record<K, T>:用作类型映射的普通对象。在上面的示例中,我可以这样写:

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

答案 3 :(得分:0)

在带有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);

快乐编码!

答案 4 :(得分:0)

尽管这在其他答案中似乎是一个错字,但是当ES6和Vanilla JS在同一项目中一起使用时,可能会出现此问题。 JS无法识别ES6映射并将其转换为空对象“ {}”。

一种快速的解决方法是,每当将ES6映射保留在JS对象中时,都使用序列化器/反序列化器

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;
}

答案 5 :(得分:-1)

您也可以使用ES6 spread-operator将任何带有JSON兼容数据的ES6 Map转换为JSON:

Show