使用JSON.stringify时输出不同

时间:2015-11-17 07:59:24

标签: javascript json

我正在使用kendo UI,但我认为这是一个普遍的问题。

基本上我记录的对象结果如下,

enter image description here

然后我JSON.stringify(obj),我得到像这样的输出

{"ProductID":5,"ProductName":"Cream","UnitPrice":12,"Discontinued":false,"UnitsInStock":15,"Priority":5}

问题,有人可以说明为什么参数"脏",' uid'没有字符串化?如果您能够发布一些创建此类对象的示例,那将会很棒。

仅供参考:我的实际对象就像stringify的输出一样,传递给了剑道网格,我从其中一个剑道网格方法中获取了脏对象(基本上给出了在网格中编辑过的行集)

有什么想法与object.prototype有关。也许父属性没有得到字符串化......

1 个答案:

答案 0 :(得分:8)

JSON.stringify仅包含对象的拥有可枚举属性,其名称为字符串。因此,有三种方法可以省略属性:如果它们是继承的,如果它们是不可枚举的(例如默认情况下创建的Object.defineProperty),或者它们的名称不是字符串(ES2015具有属性具有Symbol名称而不是字符串名称的能力。

这演示了其中的两个,“自己的”和“可枚举的”方面:例如,它记录{"answer":42},因为obj只有一个自己的可枚举属性answerprop是继承的,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的规范:

直播示例:

// 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