JSON.parse() 是如何工作的?

How does JSON.parse() work?

我没有在 javascript 上做太多工作。而且,我需要解析一个 JSON 字符串。所以,我想知道 JSON.parse 到底是做什么的。例如 : 如果我将 json 字符串分配给这样的变量,

var ab = {"name":"abcd", "details":{"address":"pqrst", "Phone":1234567890}};

现在当我打印 'ab' 时,我得到了一个对象。

同样,当我这样做时:

var pq = '{"name":"abcd", "details":{"address":"pqrst", "Phone":1234567890}}';
var rs = JSON.parse(pq);

'rs' 与 'ab' 是同一个对象。那么这两种方法有什么不同,JSON.parse 有什么不同?

这可能是个愚蠢的问题。但如果有人能解释一下,那将会很有帮助。

谢谢。

您的 'ab' 变量不是字符串,它是一个适当的 javascript 对象,因为您在它周围使用了 {}。如果您将整个内容都包含在 "" 中,那么它将是一个字符串,并将作为一行打印出来。

这是我的解释jsfiddle

//this is already a valid javascript object
//no need for you to use JSON.parse()
var obj1 = {"name":"abcd", "details":"1234"};
console.log(obj1);

//assume you want to pass a json* in your code with an ajax request
//you will receive a string formatted like a javascript object
var str1 = '{"name":"abcd", "details":"1234"}';
console.log(str1);

//in your code you probably want to treat it as an object
//so in order to do so you will use JSON.parse(), which will
//parse the string into a javascript object
var obj2 = JSON.parse(str1);
console.log(obj2);

JSON 或 JavaScript Object Notation 是用于结构化数据的最小可读格式。它主要用于在服务器和 Web 应用程序之间传输数据,作为 XML.

的替代方案

Javascript 对象是 Javascript 中的一种数据类型 - 它具有您在第一个示例中定义的 属性 和值对。

var ab = {"name":"abcd", "details":{"address":"pqrst", "Phone":1234567890}};

现在什么是 Json:JSON 字符串是一种数据交换格式 - 它只不过是一堆以特定方式格式化的字符(以便不同的程序相互通信其他)

var pq = '{"name":"abcd", "details":{"address":"pqrst", "Phone":1234567890}}';

所以它是一个 json 格式的字符串。

最后 JSON.parse() Returns 对应给定 JSON 文本的对象。

数据类型!!这就是答案。 在这种情况下,ab 是一个 objectpq 是一个字符串(含糊地说)。 打印只是一个将'anything'显示为字符串的操作。但是,您必须以不同的方式看待两者。 字符串本身是一个对象,它具有与之关联的属性和方法。在这种情况下,pq 就像一个具有值的对象:{"name":"abcd", "details":{"address":"pqrst", "Phone":1234567890}} 例如,它有一个名为 length 的 属性值为 66。 但是 ab 是一个对象,您可以查看 namedetails 作为其属性。

JSON.parse() 的不同之处在于,它将字符串解析(转换)为一个对象。并不是所有的字符串都可以解析成对象。尝试传递 {"name":"abc" 和 JSON.parse 将抛出异常。

解析前,pq没有任何属性name。如果你做了类似 pq.name 的操作,它将 return 你 undefined。但是当你使用 JSON.parse() 解析它时,rs.name 将 return 字符串 "abcd"。但是 rs 将不再有 属性 length 因为它不是字符串。如果您尝试 rs.length 那么您将得到一个未定义的值。