我想明白Javascript对象和JSON字符串之间的基本差异。
假设我创建了以下JS变量:
var testObject = {one: 1,"two":2,"three":3};
Q1。密钥/属性名称是否有/无引号?(例如"one" : 1
)
如果是,有什么区别?
Q2:如果我使用JSON.stringify(testObject)
转换上述对象,原始JS对象和JSON之间有什么区别?
我觉得他们几乎一样。请详细说明。
问题3:对于解析JSON字符串,是推荐的方法吗?
var javascriptObj = JSON.parse(jSonString);
答案 0 :(得分:224)
键/属性名称是否有/无引号?
在使用Object Literal表示法时,您需要将键括在引号中的唯一时间是键包含特殊字符(if
,:
,-
等)。值得注意的是,JSON 中的密钥必须包含在 double 引号中。
如果我使用
var jSonString = JSON.stringify(testObject);
将上述对象转换为JSON,那么2(JS obj和JSON)之间有什么区别?
JSON是一种数据交换格式。它是一个标准,它描述了有序列表和无序映射,字符串布尔值和数字如何用字符串表示。就像XML和YAML是一种在语言之间传递结构化信息的方式一样,JSON是相同的。另一方面,JavaScript对象是物理类型。就像PHP数组,C ++类/结构一样,JavaScript对象是JavaScript的内部类型。
这是一个故事。让我们想象一下,你已经从商店购买了一些家具,并且希望它能够送到。然而,库存中唯一剩下的是显示器型号,但您同意购买它。
在商店里,你购买的抽屉柜是一个活物:
var chestOfDrawers = {
color: "red",
numberOfDrawers: 4
}
但是,你不能在帖子中发送抽屉柜,所以你要拆除它(阅读,字符串化)。现在它在家具方面毫无用处。它现在是JSON。它是扁平包装形式。
{"color":"red","numberOfDrawers":4}
当您收到它时,您将重建抽屉柜(阅读,解析它)。它现在回到了一个对象形式。
JSON / XML和YAML背后的原因是使数据能够以参与语言可以理解的格式在编程语言之间传输;你不能直接给PHP或C ++你的JavaScript对象;因为每种语言都表示不同的对象。但是,因为我们已经将对象字符串化为JSON表示法;即表示数据的标准化方法,我们可以将对象的JSON 表示传输到另一个语言(C ++,PHP),它们可以重新创建我们所拥有的JavaScript对象在对象的JSON表示上拥有自己的对象 。
重要的是要注意JSON不能表示函数或日期。如果尝试使用函数成员对对象进行字符串化,则将从JSON表示中省略该函数。日期将转换为字符串;
JSON.stringify({
foo: new Date(),
blah: function () {
alert('hello');
}
}); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
对于解析JSON字符串,是推荐的方法吗?
var javascriptObj = JSON.parse(jSonString);
是的,但是older browsers don't support JSON natively (IE <8)。要支持这些,您应该包含json2.js
。
如果你正在使用jQuery,你可以调用jQuery.parseJSON()
,如果支持它将使用JSON.parse()
,否则将回退到自定义实现来解析输入。
答案 1 :(得分:30)
Q1:在javascript中定义对象文字时,键可能包含或不包含引号。没有区别,除了引号允许您指定某些键,如果您裸露尝试它们将导致解释器无法解析。例如,如果您想要一个只是感叹号的键,则需要引号:
a = { "!": 1234 } // Valid
a = { !: 1234 } // Syntax error
但在大多数情况下,您可以省略对象文字上的键周围的引号。
Q2:JSON实际上是一个字符串表示。它只是一个字符串。所以,请考虑一下:
var testObject = { hello: "world" }
var jSonString = JSON.stringify(testObject);
由于testObject
是一个真实的对象,你可以调用它上面的属性,并做任何你可以用对象做的事情:
testObject.hello => "world"
另一方面,jsonString
只是一个字符串:
jsonString.hello => undefined
请注意另一个不同之处:在JSON中,必须引用所有键。这与对象文字形成鲜明对比,根据我在Q1中的解释,通常可以省略引号。
Q3。您可以使用JSON.parse
解析JSON字符串,这通常是最好的方法(如果浏览器或框架提供它)。您也可以使用eval
,因为JSON是有效的javascript代码,但推荐使用前一种方法有很多原因(eval有很多令人讨厌的问题)。
答案 2 :(得分:9)
JSON解决的问题
假设您想要在两台计算机之间交换常规JavaScript对象,并设置两条规则:
现在在第一台主机上创建两个对象:
var obj1 = { one: 1,"two":2,"three":3 }; // your example
var obj2 = { one: obj1.one, two: 2, three: obj1.one + obj1.two };
如何将这些对象转换为字符串以便传输到第二个主机?
'{ one: 1,"two":2,"three":3 }'
获得的字符串,但实际上您无法读取文档脚本部分中的文字(至少不容易)。因此,obj1
和obj2
实际上必须以相同的方式处理。JSON已经被创建为刚才讨论的需求的解决方案:它是一组规则,通过列出所有属性和值来创建等同于对象的字符串(方法被忽略)。
JSON规范了属性名称和值的双引号的使用。
请记住,JSON只是一组规则(标准)。
创建了多少个JSON对象?
只有一个,它由JS引擎自动创建。
在浏览器中找到的现代JavaScript引擎有一个本机对象,也称为JSON。这个JSON对象能够:
使用JSON.parse(string)解码使用JSON标准构建的字符串。结果是一个常规JS对象,其中包含在JSON字符串中找到的属性和值。
使用JSON.stringify()对常规JS对象的属性/值进行编码。结果是符合JSON规则集的字符串。
(单个)JSON对象类似于编解码器,它的功能是编码和解码。
请注意:
JSON.parse()没有创建JSON对象,它创建了一个常规JS对象,使用对象文字创建的对象和JSON.parse()创建的对象之间没有区别来自符合JSON的字符串。
只有一个JSON对象,用于所有转换。
回到问题:
Q1:对象文字允许使用单引号。请注意,引号可选地用于属性名称,并且对于字符串值是必需的。对象文字本身没有引号括起来。
Q2:从文字创建并使用JSON.parse()的对象完全相同。这两个对象在创建后是等效的:
var obj1 = { one: 1, "two": 2, "three": 3 };
var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }');
问题3:在现代浏览器上JSON.parse()
用于从符合JSON的字符串创建JS对象。 (jQuery还有一个可用于所有浏览器的等效方法)。
答案 3 :(得分:7)
Q1 - 在JS中,如果密钥是保留字,或者如果它是非法令牌,则只需要使用引号。在JSON中,你必须始终在键名上使用双引号。
Q2 - jsonString
是输入对象的序列化版本...
Q3 - 使用JSON.parse()
可以反序列化到相同的对象
答案 4 :(得分:1)
问题已经发布了很好的答案,我在下面添加了一个小示例,这将使您更容易理解先前答案中给出的解释。
将以下代码段粘贴粘贴到您的IDE,以更好地理解和评论
包含invalid_javascript_object_no_quotes
对象声明的行,以避免编译时错误。
// Valid JSON strings(Observe quotes)
valid_json = '{"key":"value"}'
valid_json_2 = '{"key 1":"value 1"}' // Observe the space(special character) in key - still valid
//Valid Javascript object
valid_javascript_object_no_quotes = {
key: "value" //No special character in key, hence it is valid without quotes for key
}
//Valid Javascript object
valid_javascript_object_quotes = {
key:"value", //No special character in key, hence it is valid without quotes for key
"key 1": "value 1" // Space (special character) present in key, therefore key must be contained in double quotes - Valid
}
console.log(typeof valid_json) // string
console.log(typeof valid_javascript_object_no_quotes) // object
console.log(typeof valid_javascript_object_quotes) // object
//Invalid Javascript object
invalid_javascript_object_no_quotes = {
key 1: "value"//Space (special character) present in key, since key is not enclosed with double quotes "Invalid Javascript Object"
}