JSON.stringify忽略对象属性

fri*_*gon 14 javascript json stringify kendo-ui

请参阅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>
Run Code Online (Sandbox Code Playgroud)

将输出:

obj.dirty属性存在:true

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

但它们不会在JSON.stringify()中显示:

{"ID":"","名称":"Johhny Foosball"}

Kev*_*ock 19

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

看看这篇文章.具体来说:" 如果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));
Run Code Online (Sandbox Code Playgroud)

..和更新的小提琴.

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