JSON.stringify忽略对象属性

时间:2013-12-11 05:45:31

标签: javascript json kendo-ui 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”}

5 个答案:

答案 0 :(得分:14)

当一个对象有自己的toJSON()实现时,JSON.stringify()使用从该方法返回的对象并将其字符串化。 kendo.data.Model定义了它自己的toJSON()方法,它只返回模型上定义的属性,这就是为什么你没有看到其他值(例如dirtyid,{{ 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)

“收藏夹”字段被忽略。正如 User1Nikos 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>