考虑以下TypeScript类:
export class Spot {
public flight:number;
public dateAndTimes:Map<string,string>
public unitCost:number;
constructor(){
this.flight=0;
this.dateAndTimes= new Map<string,string>();
this.unitCost=0;
}
}
如何将Spot对象转换为JSON?
我尝试了JSON.stringify(spot)
,但是属性dateAndTimes
却被序列化为空...例如:
"spot": {
'flight':2,
{},
'unitCost':3500
}
非常感谢您!
答案 0 :(得分:1)
在MDN文档中引用JSON.stringify
:
- 所有其他Object实例(包括Map,Set,WeakMap和WeakSet)将仅对其可枚举的属性进行序列化。
由于Map
可以具有任何类型的键和值,因此即使您能够对其进行字符串化,JSON规范也无法说明"objects, arrays, numbers, strings, booleans, and null"之外的任何类型。因此,如果 $("#AddItems").change(function () {
var SelectedUserId = $("#AddItems").val();
var SelectedItem = $("#AddItems option:selected").text();
//alert(SelectedItem);
var ItemName = "Uncle Bob's Organic";
items.push(SelectedItem + '|' + SelectedUserId);
ItemId++;
//$("#tblItems").append("<tr id=" + ItemId + "><td id=" + ItemId + ">" + SelectedItem + ' ' + "<span class= 'glyphicon glyphicon-trash' title='Delete'></span><br></td></tr>");
$("#AddedItems").append("<div id=div_" + ItemId + ">" + SelectedItem + ' ' + "<span class= 'remove glyphicon glyphicon-trash' id=remove_" + ItemId + " title='Delete' data-Iname='" + ItemName.toString() + "'></span><br></div>");
});
});
$('.container').on('click', '.remove', function () {
var iname = $(this).attr("data-Iname");
var id = this.id;
var split_id = id.split("_");
var deleteindex = split_id[1];
for (var i = 0; i < items.length; i++)
{
if (iname == items[i])
{
alert(items[i])
items.splice(i, 1);
}
}
alert(items);
$("#div_" + deleteindex).remove();
});
的任何键或值不是这些类型的,那么规范将不允许它。
最后一点非常重要,因为即使Map以某种方式序列化为JSON但包含了任何类型的键或值(非上述允许的类型),也无法确定解析器如何将结果JSON处理回对象。如果没有必要使用Map,那么我建议为此使用普通对象,以完全避免出现此问题。
请注意,也无法为Map
方法使用自己的replacer
函数来处理该功能。