stringify 有啥用,然后解析一个 JSON 对象

Posted

技术标签:

【中文标题】stringify 有啥用,然后解析一个 JSON 对象【英文标题】:What is the use of stringify and then parse a JSON objectstringify 有什么用,然后解析一个 JSON 对象 【发布时间】:2016-08-11 03:42:54 【问题描述】:

stringifya JSON 对象和parseit 是否有任何具体原因。 显然它将返回 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 的字符串,其内容如下:

“回答”: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;

(注意我将texttext2 更改为objobj2;它们不是文本。)

在代码 1 的末尾,objobj2 指的是不同的对象。如果更改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,objobj2 都是对相同对象的引用。

【讨论】:

在通过网络发送对象时,在大小方面对对象进行字符串化有什么好处吗?我可以想象一个字符串小于一个对象。另一方面,它增加了每次转换的成本。 @TheFool - 您不能通过网络发送对象,您必须将其转换为可在另一端使用的一系列字节。对象没有标准的二进制格式,因此我们使用几种结构化文本格式中的任何一种。 JSON 就是其中之一。 感谢您的回答。我不确定内部会发生什么,但我很确定我可以在不明确字符串化的情况下发送对象。如果我收到它们,在 js 中,我可以像那样使用它们。如果我字符串化,我必须先解析它们。所以看起来这两个选项都可用。 @TheFool - 然后 something 正在为你做这件事(在两端)。再说一遍:对象没有标准的二进制格式。 这很有趣,因为我使用的每个库(js 和 python)都经历过这种行为。不确定 golang atm。

以上是关于stringify 有啥用,然后解析一个 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

“JSON.parse”和“JSON.stringify”有啥区别?

json文件有啥用

package-lock.json 有啥用?

JSON.parse()和JSON.stringify()用法

MSXML是啥东西?有啥用?

Json.NET 序列化回调中的 StreamingContext 参数有啥用?