Javascript对象vs JSON

我想了解Javascript对象和JSONstring之间的基本区别。

比方说,我创build了以下JSvariables:

var testObject = {one: 1,"two":2,"three":3}; 

Q1。 密钥/属性名称是否同时使用/不使用引号? (例如"one" : 1

如果是,有什么区别?

Q2:如果我使用JSON.stringify(testObject)转换上述对象,原始JS对象和JSON有什么区别?

我觉得他们几乎是一样的。 请详细说明这一点。

Q3:parsing一个JSONstring,下面推荐的方法是?

 var javascriptObj = JSON.parse(jSonString); 
  1. 密钥/属性名称是否同时使用/不使用引号?

    在使用对象文字符号时,只需要在引号中加上一个键就是密钥包含特殊字符( if :--等)的地方。 值得注意的是,JSON中的关键字必须引号括起来。

  2. 如果我使用var jSonString = JSON.stringify(testObject);将上述对象转换为JSON var jSonString = JSON.stringify(testObject); ,2(JS obj和JSON)有什么区别?

    JSON是一种数据交换格式。 这是一个标准,它描述了有序列表和无序地图,string布尔值和数字可以用string表示。 就像XML和YAML是一种在语言之间传递结构化信息的方式,JSON是一样的。 另一方面,JavaScript对象是一种物理types。 就像一个PHP数组,一个C ++类/结构体,一个JavaScript对象是JavaScript内部的一个types。

    这是一个故事。 假设你已经从商店里购买了一些家具,而且你希望它交付。 但是,剩下的只有显示模式,但你同意购买它。

    在商店里,你购买的抽屉是一个活物:

     var chestOfDrawers = { color: "red", numberOfDrawers: 4 } 

    然而,你不能在邮件中发送一个抽屉柜,所以你把它拆下来(读,把它串起来)。 在家具方面现在是无用的。 现在是JSON。 它在平坦的forms。

     {"color":"red","numberOfDrawers":4} 

    当你收到它,然后你重build抽屉柜(阅读,parsing它)。 它现在回到了一个对象forms。

    JSON / XML和YAML背后的原因是为了使参与语言能够理解的格式之间的数据在编程语言之间传输。 你不能直接给PHP或C ++ JavaScript对象; 因为每种语言都代表了一个不同的对象。 但是,因为我们已经将对象串化为JSON表示法; 即一种表示数据的标准化方式,我们可以将对象的JSON 表示转换为另一种语言(C ++,PHP),他们可以基于对象的JSON表示重新创build我们拥有的JavaScript对象。

    注意JSON不能代表函数或date是很重要的。 如果您尝试使用函数成员对对象进行string化,则该函数将从JSON表示中省略。 一个date将被转换为一个string;

     JSON.stringify({ foo: new Date(), blah: function () { alert('hello'); } }); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}" 
  3. parsing一个JSONstring,下面推荐的方法是? var javascriptObj = JSON.parse(jSonString);

    是的,但旧版浏览器本身不支持JSON(IE <8) 。 为了支持这些,你应该包含json2.js

    如果您使用的是jQuery,那么可以调用jQuery.parseJSON() ,如果支持,将使用JSON.parse() ,否则将回退到自定义实现来parsinginput。

Q1:在javascript中定义对象字面值时,键可能包含引号或不包含引号。 除了引号允许指定某些可能导致解释器parsing失败的键之外,没有区别。 例如,如果您想要一个只是感叹号的密钥,则需要引号:

 a = { "!": 1234 } // Valid a = { !: 1234 } // Syntax error 

不过在大多数情况下,您可以省略对象文字上的引号。

Q2:JSON实际上是一个string表示。 这只是一个string。 所以,考虑一下:

 var testObject = { hello: "world" } var jSonString = JSON.stringify(testObject); 

由于testObject是一个真实的对象,你可以调用它的属性,并做任何你可以做的对象:

 testObject.hello => "world" 

另一方面, jsonString只是一个string:

 jsonString.hello => undefined 

注意另一个区别:在JSON中,必须引用所有的键。 这与对象文字形成对比,根据我在第一季的解释,通常可以省略引号。

Q3。 您可以使用JSON.parseparsingJSONstring,这通常是最好的方法(如果浏览器或框架提供的话)。 你也可以使用eval因为JSON是有效的javascript代码,但是前面的方法是由于很多原因而推荐的(eval有很多与它相关的讨厌的问题)。

Q1 – 在JS中,如果密钥是保留字或者是非法标记,则只需使用引号。 在JSON中,您必须始终在键名称上使用双引号。

Q2 – jsonString是input对象的序列化版本…

Q3 – 可能使用JSON.parse()将其反序列化为相同的外观对象

JSON解决的问题

假设您想要在两台计算机之间交换常规JavaScript对象,并设置了两条规则:

  • 传输的数据必须是常规string。
  • 只有属性可以交换,方法不传输。

现在在第一台主机上创build两个对象:

 var obj1 = { one: 1,"two":2,"three":3 }; // your example var obj2 = { one: obj1.one, two: 2, three: obj1.one + obj1.two }; 

如何将这些对象转换为string传输给第二个主机?

  • 对于第一个对象,您可以发送从字面定义'{ one: 1,"two":2,"three":3 }'获得的string,但实际上不能读取脚本部分中的字面值文件(至less不太容易)。 所以obj1obj2实际上必须以相同的方式处理。
  • 您需要枚举所有属性及其值,并构build一个类似于对象字面值的string。

JSON被创build为解决刚刚讨论的需求的一种方法:通过列出所有的属性和值(方法被忽略),创build一个等价于对象的string。

JSON标准化了属性名称和值的双引号的使用。

请记住,JSON只是一组规则(一个标准)。

多less个JSON对象被创build?

只有一个,它是由JS引擎自动创build的。

在浏览器中find的现代JavaScript引擎有一个本地对象,也被称为JSON。 这个JSON对象能够:

  • 使用JSON.parse(string)解码使用JSON标准构build的string。 结果是在JSONstring中find具有属性和值的常规JS对象。

  • 使用JSON.stringify()对常规JS对象的属性/值进行编码。 结果是一个符合JSON规则集的string。

(单个)JSON对象类似于一个编解码器,它的function是编码和解码。

注意:

  • JSON.parse()不创buildJSON对象,它创build一个常规的JS对象,使用对象字面量创build的对象与JSON兼容string中JSON.parse()创build的对象之间没有区别。

  • 只有一个JSON对象,用于所有转换。

回到问题

  • Q1:对象文字允许使用单引号。 请注意,引号可用于属性名称,对于string值是必需的。 对象字面本身不被引号包围。

  • Q2:从文字和使用JSON.parse()创build的对象严格相同。 这两个对象在创build后是等价的:

    var obj1 = { one: 1, "two": 2, "three": 3 };
    var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }');

  • 问题3:在现代浏览器上, JSON.parse()用于从符合JSON的string中创build一个JS对象。 (jQuery也有一个可用于所有浏览器的等效方法)。