Angular2 JSON.stringify

时间:2017-05-09 16:36:47

标签: json angular date stringify

为什么Angular2会覆盖JSON.stringify!?

我已经覆盖了我自己的Date.toJSON,但在字符串化对象时没有调用它。

在下面的例子中它正常工作,但它在Angular App中不起作用!

<html>
  
  <body>
    
    Custom Date Fomat : <span id="date1"></span><br>
    ISO Date Format : <span id="date2"></span>
  
  </body>
  
  <script>
    Date.prototype.toJSON = function(){
      var day = date.getDate();
      var month = date.getMonth() + 1;
      var year = date.getFullYear();

      var s =  year + "-" + 
        (month > 9 ? "" : "0") + month + "-" + 
        (day   > 9 ? "" : "0") + day   + "T00:00:00.000Z";

      return s;
    }
  
    var date = new Date();
    document.getElementById("date1").innerHTML = JSON.stringify({date});
    document.getElementById("date2").innerHTML = date.toISOString();
  
  </script>

</html>

1 个答案:

答案 0 :(得分:2)

JSON.stringify只会复制属于对象'自己'属性的属性 - 即该对象的“顶级”属性。如果你有一个使用原型继承的复杂javascript对象,它将不会复制来自原型链的属性。

基本上,一旦处理了特定类型的对象(使用函数构造函数创建),就不能相信JSON.stringify会按预期执行。 JSON规范允许这样的自定义对象提供自己的.toJson()方法,JSON.stringify将使用它。但并非所有图书馆供应商(或浏览器供应商)都愿意提供此功能。

幸运的是,解决方法非常简单。您可以提供/附加自己的.toJson()方法,或者在收到对象后立即将对象的属性“复制”到pojo(普通的旧javascript对象)中。一旦你处理了一个pojo,JSON.stringify就能很好地工作。但请注意,对象的所有子属性都将作为本机数据类型或pojos复制。