请参阅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函数.使用风险自负!