JSON.stringify正在忽略对象属性

JSON.stringify is ignoring object properties

本文关键字:对象 属性 stringify JSON      更新时间:2023-09-26

请参阅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":"Johny Foosball"}

当一个对象有自己的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));

以及更新后的小提琴。

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

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

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

而不是JSON.stringify

它使用自己的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

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

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

当我需要将所选项目从kendo树传递给json格式化程序指令时,我遇到了这种情况。但你知道吗,剑道已经把我原来的东西搞砸了。

<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>