我在 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);
当我试图在控制台中打印它时,它也返回了{}
。
6条答案
按热度按时间7d7tgy0s1#
可读吗?不,但它能用
就像@james-hay指出的,您有一个输入错误,可能使对象为空
7hiiyaii2#
我最终放弃了使用es6 Map,转而使用TSMap,
tags.toJSON()
可以在上面工作。omqzjyyz3#
虽然它没有直接回答您的问题:当我遇到同样的问题时,我重新考虑了Map的使用,选择了普通的JavaScript对象。2因为JSON总是需要字符串作为键,所以Map的一个主要优点(任何类型的键)也就失去了。
Map的另一个优点是允许一个很好的类型签名,比如
Map<String, Array<String>>
,但是这里TypeScript的“索引签名”为普通JavaScript对象提供了这个签名,甚至允许为键命名:这几乎可以像Map一样使用(当然,语法不同),它直接转换为JSON *,即使是嵌套的 *。我认为后者在将对象树转换为JSON时非常重要,在JSON中,Map可以嵌套在其他任意对象和数组的深处。
或者,对于此用例,TypeScript也具有类型
Record<K, T>
:一个普通的对象,用作类型Map。在上面的例子中,我可以写:bmvo0sr54#
在带有lib es2015的Nativescript中,我可以执行以下操作:
从对象到字符串:
从字符串到对象:
快乐编码!
c9x0cxw05#
很惊讶这一点还没有被提及:
在我看来是最可读的解决方案。
zzzyeukh6#
虽然这似乎是一个拼写错误,正如其他答案所指出的,当ES6和vanilla JS在同一个项目中一起使用时,这个问题可能会发生。JS不会识别ES6Map并将其转换为空对象“{}"。
一个快速的解决方法是,在JS对象中持久化ES6Map时使用序列化器/反序列化器
ES6至JS
JS至ES6