从JS对象到JSON Angular

时间:2018-09-27 20:14:02

标签: javascript json angular typescript

考虑以下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
}

非常感谢您!

1 个答案:

答案 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函数来处理该功能。