请参阅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”}
答案 0 :(得分:14)
当一个对象有自己的toJSON()
实现时,JSON.stringify()
使用从该方法返回的对象并将其字符串化。 kendo.data.Model
定义了它自己的toJSON()
方法,它只返回模型上定义的属性,这就是为什么你没有看到其他值(例如dirty
,id
,{{ 1}})在字符串结果中。
看看this article。具体来说:“如果stringify方法看到包含toJSON方法的对象,它会调用该方法,并将返回的值字符串化。这允许对象确定自己的JSON表示。”
如果必须拥有对象的所有属性,则可以使用以下选项:
uid
..和updated fiddle。
基本上我用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
函数。使用风险自负! :)
答案 1 :(得分:0)
如果您使用的是NodeJS,则可以使用:
import * as util from 'util';
util.inspect(obj)
代替JSON.stringify
答案 2 :(得分:0)
它正在使用自己的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
答案 3 :(得分:0)
这有点老了。但我面临着类似的问题。就在服务返回分页查询结果之前 - 我需要在对象中插入一个字段和值。
var universities = await University.paginate(pagingOptions);
const updatedDocsTemp = universities.docs.map(university=>
{
university["Favorite"] = showonlytempfavorites;
return university;
});
universities.docs = updatedDocsTemp;
但是 - 调用 stringify 的代码时。
JSON.stringify(universities)
“收藏夹”字段被忽略。正如 User1 和 Nikos Papageorgiou 所提到的 我确认这有效
var universities = await University.paginate(pagingOptions);
universities = JSON.parse(JSON.stringify(universities));
const updatedDocsTemp = universities.docs.map(university=>
{
university["Favorite"] = showonlytempfavorites;
return university;
});
universities.docs = updatedDocsTemp;
我想知道为什么 nikos-papageorgiou 为 -2。
答案 4 :(得分:-2)
有些相关,因为我来到这里寻找类似情况的解决方案:对于那些想要找回原始对象的方法,在kendo为其添加各种奇怪的隐藏属性之前,请执行:
cleanObject = JSON.parse(JSON.stringify(kendoDataItem));
当我需要将所选项从kendo树传递给json-formatter指令时,我遇到了这种情况。但是你知道吗,剑道已经搞砸了我的原始物体。
<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>