本文介绍了JSON.stringify忽略对象属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请参见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":",名称":"Johhny Foosball"}

解决方案

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

请参阅本文.具体来说:"如果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函数.使用风险自负! :)

See the jsfiddle example http://jsfiddle.net/frigon/H6ssq/

For some reason there are fields that JSON.stringify is ignoring. Is there a way to force JSON.stringify to parse them?

As the jsfiddle shows... this code...

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

will output:

obj.dirty property exists: true

obj.uid property exists: b4af4dfc-9d94-4a2d-b286-d6f4cbc991d8

But they dont show in JSON.stringify():

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

解决方案

When an object has its own toJSON() implementation, JSON.stringify() uses the object returned from that method and stringifies that. kendo.data.Model defines it's own toJSON() method which only returns the properties defined on the model, which is why you aren't seeing other values (e.g. dirty, id, uid) in the string result.

Take a look at this article. Specifically: "If the stringify method sees an object that contains a toJSON method, it calls that method, and stringifies the value returned. This allows an object to determine its own JSON representation."

Here's an alternative if you must have all properties on the object:

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

..and the updated fiddle.

Basically I used jQuery.extend to clone the object then deleted the toJSON function. Use at your own risk! :)

这篇关于JSON.stringify忽略对象属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-30 09:56