Javascript对象Vs JSON

我想清楚地了解Javascript对象和JSON字符串之间的基本区别。

假设我创建了以下JS变量:

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

Q1。键/属性名是否带引号或不带引号都有效?(例如"one" : 1)

如果是,有什么区别?

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

我觉得它们几乎一样。请详细说明。

Q3:对于解析JSON字符串,是否推荐使用下面的方法?

var javascriptObj = JSON.parse(jSonString);
113208 次浏览
  1. 键/属性名是否带引号或不带引号都有效?

使用对象文字表示法时,唯一需要将键括在引号中的情况是键是保留字或包含特殊字符(if:-等)。值得注意的是,JSON 必须中的键被括在引号中。

  1. 如果我使用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
}

然而,你不能邮寄一个抽屉柜,所以你把它拆开了(读,stringify它)。就家具而言,它现在已经没用了。现在是JSON。它是平装的。

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

当您收到它时,然后重新构建抽屉柜(读取、解析它)。现在它又回到了对象形式。

JSON、XML和YAML背后的原因是能够在编程语言之间以两种参与语言都能理解的格式传输数据;你不能直接给PHP或c++你的JavaScript对象;因为每种语言在底层都以不同的方式表示对象。然而,因为我们已经将对象字符串化为JSON表示法;即一种标准化的方式来表示数据,我们可以将对象的JSON 表示传输到另一种语言(c++, PHP),他们可以将我们拥有的JavaScript对象重新创建转换为他们自己的对象基于上的JSON表示的对象。

需要注意的是,JSON不能表示函数或日期。如果您尝试用函数成员对对象进行stringify,则该函数将从JSON表示中省略。日期将被转换为字符串;

    JSON.stringify({
foo: new Date(),
blah: function () {
alert('hello');
}
}); // returns the string "{"foo":"2011-11-28T10:21:33.939Z"}"
  1. 对于解析JSON字符串,是否推荐使用下面的方法?var javascriptObj = JSON.parse(jSonString);

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

如果你正在使用jQuery,你可以调用jQuery.parseJSON(),如果它被支持,它将在底层使用JSON.parse(),否则将回退到一个自定义实现来解析输入。

Q1 -在JS中,你只需要在关键字是保留字或它是非法令牌时使用引号。在JSON中,你必须在键名上使用双引号。

Q2 - jsonString是输入对象的连载版本…

Q3 -这可能是deserialised到一个相同的对象使用JSON.parse()

Q1:在javascript中定义对象字面值时,键可能包含引号,也可能不包含。除了引号允许您指定某些键以外,没有什么区别,如果您尝试裸引号,这些键将导致解释器无法解析。例如,如果你想要一个只是感叹号的键,你需要引号:

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

但在大多数情况下,可以省略对象字面量键周围的引号。

JSON实际上是一个字符串表示。它只是一个字符串。所以,想想这个:

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

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

testObject.hello => "world"

另一方面,jsonString只是一个字符串:

jsonString.hello => undefined

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

第三季。你可以通过使用JSON.parse来解析JSON字符串,这通常是最好的方法(如果浏览器或框架提供了它)。你也可以只使用eval,因为JSON是有效的javascript代码,但推荐使用前一种方法有很多原因(eval有很多与之相关的讨厌的问题)。

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 }'中获得的字符串,但实际上你不能读取文档脚本部分的字面值(至少不容易)。所以obj1obj2实际上必须以相同的方式处理。
  • 您需要枚举所有属性及其值,并构建一个类似于对象字面量的字符串。

创建JSON是为了解决刚才讨论的需求:它是一组规则,通过列出所有属性和值(方法被忽略)来创建与对象等效的字符串。

JSON规范了属性名和值的双引号使用。

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

创建了多少JSON对象?

只有一个,它由JS引擎自动创建。

浏览器中的现代JavaScript引擎有一个原生对象,也称为JSON。这个JSON对象能够:

  • 解码使用JSON标准构建的字符串,使用JSON.parse(string)。结果是一个常规的JS对象,其属性和值可以在JSON字符串中找到。

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

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

注意:

  • JSON.parse()不创建JSON对象,它创建一个普通的JS对象,使用对象文字创建的对象和由JSON.parse()从JSON兼容字符串创建的对象之间没有区别。

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

回到问题上来:

  • Q1:对象字面量允许使用单引号或双引号。注意,引号可选用于属性名,对于字符串值是必须的。对象文字本身没有引号括起来。

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

    < p > var obj1 = { one: 1, "two": 2, "three": 3 }; < br > 李var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }'); < / p > < / >
  • Q3:在现代浏览器中,JSON.parse()用于从json兼容的字符串创建JS对象。(jQuery也有一个等效的方法,可以用于所有浏览器)。

问题已经有很好的答案张贴,我在下面添加了一个小例子,这将使它更容易理解在以前的答案给出的解释。 复制粘贴下面的代码片段到您的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"
}