我在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);
当我尝试在控制台中打印时,这也返回了{}
。
答案 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