JSON.stringify正在忽略对象属性
JSON.stringify is ignoring object properties
请参阅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()
方法,该方法只返回在模型上定义的属性,这就是为什么在字符串结果中看不到其他值(例如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));
以及更新后的小提琴。
基本上,我使用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>
- 如何从对象的原型方法访问JavaScript对象属性
- 如何将数组项添加到对象属性中
- 设置嵌套对象属性的更好方法
- JavaScript管理具有重复属性名称的对象属性
- 如何使用element.myobj.prop等具有对象属性的元素
- 如何使用(this)访问Angular 2 http rxjs catch函数中的对象属性
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 如何在AngularJS工厂中正确声明对象属性
- 如何使用object.assign()从其他对象引用基本对象属性
- 使用XPath样式访问Javascript JSON对象属性
- 将javascript对象(属性+值)合并到一个对象中
- 数组:使对象属性成为数组键
- 无法从JavaScript中的函数调用对象属性
- Google Closure Advanced |无法识别对象属性|动态属性
- Javascript从匿名函数访问外部对象属性
- 从函数更改对象属性
- 如何从字符串变量访问对象属性
- 从嵌套对象属性中获取排除某个值的最高值
- 在Aurelia computeds中,当设置依赖关系时,如何声明对对象属性的依赖关系
- 传递数量不确定的可能嵌套的对象属性