stringify 有啥用,然后解析一个 JSON 对象
Posted
技术标签:
【中文标题】stringify 有啥用,然后解析一个 JSON 对象【英文标题】:What is the use of stringify and then parse a JSON objectstringify 有什么用,然后解析一个 JSON 对象 【发布时间】:2016-08-11 03:42:54 【问题描述】:stringify
a JSON 对象和parse
it 是否有任何具体原因。
显然它将返回 Initial 对象本身。
这样做有什么好处吗?
代码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;
【问题讨论】:
“stringify
一个 JSON 对象和parse
有什么具体原因。” 您添加的代码与您描述的相反。跨度>
您的 更新 代码基本上没有意义。您将 string 传递给 JSON.stringify
.
【参考方案1】:
我认为你可能有一个根本的误解。 JSON 是一种用于数据交换的文本符号。如果您正在处理 javascript 源代码,而不是处理 字符串,那么您就不是在处理 JSON。
您不会“获取 JSON 对象并 stringify
它”。如果是对象,则不是 JSON;如果它是对象的 JSON 表示法,则它是一个字符串,您不会对其进行字符串化。
这是一个对象:
var foo = answer: 42;
这里使用stringify
:
var str = JSON.stringify(foo);
现在str
是一个包含 JSON 的字符串,其内容如下:
...就像你写的一样:
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
都是对相同对象的引用。
【讨论】:
在通过网络发送对象时,在大小方面对对象进行字符串化有什么好处吗?我可以想象一个字符串小于一个对象。另一方面,它增加了每次转换的成本。 @TheFool - 您不能通过网络发送对象,您必须将其转换为可在另一端使用的一系列字节。对象没有标准的二进制格式,因此我们使用几种结构化文本格式中的任何一种。 JSON 就是其中之一。 感谢您的回答。我不确定内部会发生什么,但我很确定我可以在不明确字符串化的情况下发送对象。如果我收到它们,在 js 中,我可以像那样使用它们。如果我字符串化,我必须先解析它们。所以看起来这两个选项都可用。 @TheFool - 然后 something 正在为你做这件事(在两端)。再说一遍:对象没有标准的二进制格式。 这很有趣,因为我使用的每个库(js 和 python)都经历过这种行为。不确定 golang atm。以上是关于stringify 有啥用,然后解析一个 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章
“JSON.parse”和“JSON.stringify”有啥区别?