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

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

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

Q1。键/属性名是否带引号或不带引号都有效?(如。“一”:

如果是,有什么区别?

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

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

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

var javascriptObj = JSON.parse(jSonString);

当前回答

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

Q2 - jsonString是输入对象的序列化版本…

Q3 -可以使用JSON.parse()将其反序列化为相同的对象

其他回答

键/属性名是否带引号或不带引号都有效?

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

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

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

The reason behind JSON, XML and YAML is to enable data to be transferred between programming languages in a format both participating languages can understand; you can't give PHP or C++ your JavaScript object directly; because each language represents an object differently under-the-hood. However, because we've stringified the object into JSON notation; i.e. a standardised way to represent data, we can transmit the JSON representation of the object to another language (C++, PHP), they can recreate the JavaScript object we had into their own object based on the JSON representation of the object.

需要注意的是,JSON不能表示函数或日期。如果您尝试用函数成员对对象进行stringify,则该函数将从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);

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

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

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

Q2 - jsonString是输入对象的序列化版本…

Q3 -可以使用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来解析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}'中获得的字符串,但实际上您无法读取文档脚本部分的字面值(至少不容易)。所以obj1和obj2必须以同样的方式处理。 您需要枚举所有属性及其值,并构建一个类似于对象字面量的字符串。

创建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: The use of single of double quotes is allowed for object literals. Note that the quotes are used optionally for attributes names, and are mandatory for string values. The object literal itself is not surrounded by quotes. Q2: Objects created from literals and using JSON.parse() are strictly the same. These two objects are equivalent after creation: var obj1 = { one: 1, "two": 2, "three": 3 }; var obj2 = JSON.parse('{ "one": "1", "two": "2", "three": "3" }'); Q3: On modern browsers JSON.parse() is used to create a JS object from a JSON-compliant string. (jQuery has also an equivalent method that can be used for all browsers).

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