我认为你可能有一个根本的误解。 JSON 是一种用于数据交换的文本符号。如果您正在处理 JavaScript 源代码,而不是处理 字符串,那么您就不是在处理 JSON。
您不会“获取 JSON 对象并 stringify 它”。如果是对象,则不是 JSON;如果它是对象的 JSON 表示法,则它是一个字符串,您不会对其进行字符串化。
这是一个对象:
var foo = {answer: 42};
这里使用stringify:
var str = JSON.stringify(foo);
现在str 是一个包含 JSON 的字符串,其内容如下:
{“回答”:42}
...就像你写的一样:
var str = '{"answer":42}';
您可以将其解析回一个对象(注意:不是“JSON 对象”,只是一个对象):
var foo2 = JSON.parse(str);
现在,foo 指的是原始对象,foo2 指的是具有属性副本的不同对象:
console.log(foo == foo2); // false, they're different object
console.log(foo.answer == foo2.answer); // true, they each have an answer property
// and their values match
console.log(foo.answer); // 42
console.log(foo2.answer); // 42
foo2.answer = 67;
console.log(foo.answer); // 42 | the objects and their properties
console.log(foo2.answer); // 67 | are not connected in any way
stringify 一个 JSON 对象和parse 是否有任何具体原因。
有时人们将其用作穷人的克隆方法,因为您返回的对象与您字符串化的对象不同;它是一个具有相同属性的新对象(前提是原始的所有属性都可以序列化为 JSON;引用函数或值 undefined 的属性不能,并且许多其他值 [如日期] 不'如果没有 JSON.parse 的“reviver”函数,就不能转换回来,所以它们最终是字符串或数字)。
这符合您问题的最新版本中的代码:
代码1:字符串化然后解析
var textstring = '{ "employees" : [' +
'{ "firstName":"John" , "lastName":"Doe" },' +
'{ "firstName":"Anna" , "lastName":"Smith" },' +
'{ "firstName":"Peter" , "lastName":"Jones" } ]}';
var obj=JSON.parse(textstring);
var obj2=JSON.parse(JSON.stringify(obj));
代码 2:直接使用
var textstring = '{ "employees" : [' +
'{ "firstName":"John" , "lastName":"Doe" },' +
'{ "firstName":"Anna" , "lastName":"Smith" },' +
'{ "firstName":"Peter" , "lastName":"Jones" } ]}';
var obj=JSON.parse(textstring);
var obj2=obj;
(注意我将text 和text2 更改为obj 和obj2;它们不是文本。)
在代码 1 的末尾,obj 和 obj2 指的是不同的对象。如果更改obj 所指对象的属性之一,obj2 将完全不变:
// Replace the employees array with a blank one
obj.employees = [];
// No effect at all on obj2:
console.log(obj2.employees[0].firstName); // "John"
相比之下,当然,对于代码 2,obj 和 obj2 都是对相同对象的引用。