【问题标题】:JSON.stringify is ignoring object propertiesJSON.stringify 忽略对象属性
【发布时间】:2013-12-28 23:17:35
【问题描述】:

查看 jsfiddle 示例 http://jsfiddle.net/frigon/H6ssq/

由于某种原因,JSON.stringify 忽略了一些字段。有没有办法强制 JSON.stringify 解析它们?

正如 jsfiddle 所示...这段代码...

<script src="http://cdn.kendostatic.com/2012.2.710/js/kendo.all.min.js"></script>
    <script>
    var model = kendo.data.Model.define({id: "ID", fields: {"Name":{type: "string"}}});
    var obj = new model();
    obj.set("Name","Johhny Foosball");
    document.write("<br />obj.dirty property exists: ");
    document.write(obj.dirty);
    document.write("<br/>obj.uid property exists: ");
    document.write(obj.uid);
    document.write("<br/>But they dont show in JSON.stringify():<br/>");    
    document.write(JSON.stringify(obj));
</script>

将输出:

obj.dirty 属性存在:true

obj.uid 属性存在:b4af4dfc-9d94-4a2d-b286-d6f4cbc991d8

但它们没有显示在 JSON.stringify() 中:

{"ID":"","Name":"Johhny Foosball"}

【问题讨论】:

    标签: javascript json kendo-ui stringify


    【解决方案1】:

    当一个对象有自己的toJSON() 实现时,JSON.stringify() 使用从该方法返回的对象并将其字符串化。 kendo.data.Model 定义了它自己的 toJSON() 方法,它只返回模型上定义的属性,这就是为什么您在字符串结果中看不到其他值(例如 dirtyiduid)。

    "如果 stringify 方法看到一个包含 toJSON 方法的对象,它会调用该方法,并将返回的值字符串化。这允许对象确定自己的 JSON 表示形式。"

    如果您必须拥有对象的所有属性,这里有一个替代方法:

    var model = kendo.data.Model.define({
        id: "ID",
        fields: {
            "Name": { type: "string" }
        }
    });
    var obj = new model();
    obj.set("Name","Johhny Foosball");    
    var newObj = $.extend({}, obj);
    delete newObj.toJSON;
    document.write(newObj.dirty);
    document.write(JSON.stringify(newObj));
    

    ..还有updated fiddle.

    基本上我使用jQuery.extend 克隆对象,然后删除toJSON 函数。使用风险自负! :)

    【讨论】:

      【解决方案2】:

      如果你在 NodeJS 中工作,你可以使用:

      import * as util from 'util';
      util.inspect(obj)
      

      而不是 JSON.stringify

      【讨论】:

        【解决方案3】:

        它使用自己的 JSON.stringify 方法。 Sequelize 发生在我身上。我在添加新属性之前对对象进行字符串化,如下所示:

        objStringified = JSON.stringify(obj) // uses its own JSON.stringify method
        obj = JSON.parse(objStringified) // only shows properties specified as columns in its model
        obj.dirty = "whatever";
        finalObj = JSON.stringify(objParsed); // now it doesn't have its own JSON.stringify method, so dirty property appears
        

        【讨论】:

          【解决方案4】:

          有点相关,因为我来这里是为了寻找类似情况的解决方案:对于那些想要找回原始对象的方法,在剑道添加各种奇怪的隐藏属性之前,这样做:

          cleanObject = JSON.parse(JSON.stringify(kendoDataItem));
          

          当我需要将所选项目从剑道树传递到 json-formatter 指令时,我遇到了这种情况。但是你知道吗,剑道已经把我原来的对象搞砸了。

          <div kendo-tree-view="tree" k-data-source="treeData" k-on-change="selectedItem=dataItem">
              {{dataItem.text}}
          </div>
          
          <json-formatter open="1" json="selectedItem"></json-formatter>
          

          【讨论】:

          • 认真的吗?那家伙说JSON.stringify 不起作用,而您在示例中使用JSON.stringify
          • 仔细阅读。
          • JSON.stringify 不工作。该代码如何返回正确的值?
          猜你喜欢
          • 2011-11-18
          • 1970-01-01
          • 2014-05-06
          • 1970-01-01
          • 2013-04-16
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多