我正在使用kendo UI,但我认为这是一个普遍的问题。
基本上我记录的对象结果如下,
然后我JSON.stringify(obj),我得到像这样的输出
{"ProductID":5,"ProductName":"Cream","UnitPrice":12,"Discontinued":false,"UnitsInStock":15,"Priority":5}
问题,有人可以说明为什么参数"脏",' uid'没有字符串化?如果您能够发布一些创建此类对象的示例,那将会很棒。
仅供参考:我的实际对象就像stringify的输出一样,传递给了剑道网格,我从其中一个剑道网格方法中获取了脏对象(基本上给出了在网格中编辑过的行集)
有什么想法与object.prototype有关。也许父属性没有得到字符串化......
答案 0 :(得分:8)
JSON.stringify
仅包含对象的拥有,可枚举属性,其名称为字符串。因此,有三种方法可以省略属性:如果它们是继承的,如果它们是不可枚举的(例如默认情况下创建的Object.defineProperty
),或者它们的名称不是字符串(ES2015具有属性具有Symbol
名称而不是字符串名称的能力。
这演示了其中的两个,“自己的”和“可枚举的”方面:例如,它记录{"answer":42}
,因为obj
只有一个自己的可枚举属性answer
。 prop
是继承的,foo
是不可枚举的:
// An object to use as a prototype
var proto = {
prop: 1
};
// Create an object using that as its prototype
var obj = Object.create(proto);
// Define a non-enumerable property
Object.defineProperty(obj, "foo", {
value: 27
});
// Define an own, enumerable property
obj.answer = 42;
// Show the JSON for the object
snippet.log(JSON.stringify(obj));
这是JSON.stringify
的规范:
JSON.stringify
调用抽象规范操作SerializeJSONProperty
SerializeJSONProperty
,对于对象,最终会调用SerializeJSONObject
SerializeJSONObject
调用EnumerableOwnProperties
获取要序列化的属性列表
直播示例:
// An object to use as a prototype
var proto = {
prop: 1
};
// Create an object using that as its prototype
var obj = Object.create(proto);
// Define a non-enumerable property
Object.defineProperty(obj, "foo", {
value: 27
});
// Define an own, enumerable property
obj.answer = 42;
// Show the JSON for the object
snippet.log(JSON.stringify(obj));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
为了完整起见,这表明Symbol
- 命名的属性也被排除在外(live copy on Babel's REPL):
// An object to use as a prototype
var proto = {
prop: 1
};
// Create an object using that as its prototype
var obj = Object.create(proto);
// Define a non-enumerable property
Object.defineProperty(obj, "foo", {
value: 27
});
// Define an own, enumerable property with a string name
obj.answer = 42;
// Define an own, enumerable property with a Symbol name
var s1 = Symbol();
obj[s1] = "I'm enumerable and have a Symbol name";
// Show the JSON for the object
console.log(JSON.stringify(obj)); // {"answer":42}
// Proof that the Symbol property was enumerable comes
// from Object.assign
var obj2 = Object.assign(obj);
console.log(obj2[s1]); // I'm enumerable and have a Symbol name