javascript – 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()方法,该方法只返回模型上定义的属性,这就是你没有在字符串结果中看到其他值(例如dirty,id,uid)的原因.

看一下this article.具体来说:“如果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函数.使用风险自负!

上一篇:JSON.stringify使用时不安全的JSON值


下一篇:input 输入框 json格式展示