有人能告诉我使用对象文字表示法定义的JavaScript对象和JSON对象的主要区别是什么吗?
根据一本JavaScript书,它说这是一个使用对象符号定义的对象:
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
为什么这里不是JSON对象?仅仅因为它不是用引号定义的吗?
有人能告诉我使用对象文字表示法定义的JavaScript对象和JSON对象的主要区别是什么吗?
根据一本JavaScript书,它说这是一个使用对象符号定义的对象:
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
为什么这里不是JSON对象?仅仅因为它不是用引号定义的吗?
让我们首先澄清什么是JSON。JSON是一种文本的、独立于语言的数据交换格式,很像XML、CSV或YAML。
数据可以以多种方式存储,但如果要将其存储在文本文件中并可由计算机读取,则需要遵循某种结构。JSON是定义这种结构的众多格式之一。
这些格式通常是独立于语言的,这意味着它们可以被Java、Python、JavaScript、PHP等等处理。
相反,JavaScript是一种编程语言。当然JavaScript也提供了一种定义/描述数据的方法,但是语法是JavaScript特有的。
作为一个反例,Python有元组的概念,它们的语法是(x, y)。JavaScript没有这样的东西。
让我们看看JSON和JavaScript对象文字之间的语法差异。
JSON有以下语法约束:
对象键必须是字符串(即用双引号括起来的字符序列)。 取值为: 一个字符串 一个数字 一个JSON对象 一个数组 真正的 假 零 重复的键({"foo":"bar","foo":"baz"})产生未定义的、特定于实现的结果;JSON规范没有明确定义它们的语义
在JavaScript中,对象字面量可以有
字符串字面量,数字字面量或标识符名称作为键(从ES6开始,键现在也可以计算,这引入了另一种语法)。 值可以是任何有效的JavaScript表达式,包括函数定义和未定义。 重复的键产生定义的、指定的结果(在松散模式下,后一种定义替换前一种定义;在严格模式下,这是一个错误)。
只要看看语法,您的示例就不是JSON,原因有两个:
键不是字符串(字面量)。它们是标识符名称。 不能将函数作为值分配给“JSON对象”(因为JSON没有为函数定义任何语法)。
但最重要的是,重复一下开头的解释:您处于JavaScript上下文中。定义一个JavaScript对象。如果有,“JSON对象”只能包含在字符串中:
var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
var json = '{"foo": 452}'; // creates a string containing JSON
也就是说,如果您正在编写JavaScript源代码,而不处理字符串,那么您就不是在处理JSON。也许你收到的数据是JSON格式的(例如,通过ajax或从文件中读取),但是一旦你或你正在使用的库解析了它,它就不再是JSON了。
仅仅因为对象文字和JSON看起来相似,这并不意味着可以将它们互换命名。请参见没有“JSON对象”这样的东西。
据我所知,主要的区别是灵活性。
JSON是“JavaScript对象表示法”的一种包装,它迫使用户在定义对象时遵守更严格的规则。它通过限制JavaScript对象表示法特性提供的可能的对象声明方式来做到这一点。
因此,我们有一个更简单、更标准化的对象,更适合于平台之间的数据交换。
基本上,上面例子中的newObject是一个使用JavaScript object Notation定义的对象;但它不是一个“有效的”JSON对象,因为它不遵循JSON标准要求的规则。
这个链接也很有用: http://msdn.microsoft.com/en-us/library/bb299886.aspx
根据JavaScript中的JSON,
JSON是对象的子集 JavaScript的文字符号。
换句话说,有效的JSON也是有效的JavaScript对象文字表示法,但不一定是相反。
除了阅读文档(正如@Filix King所建议的),我还建议使用JSONLint在线JSON验证器。这就是为什么我知道JSON对象的键必须是字符串。
实际上没有所谓的“JSON对象”。
JSON规范是一种将数据编码为字符串的语法。人们所说的“JSON对象”(在javascript中)实际上只是一个普通的javascript对象,它(可能)已经从一个有效的JSON字符串反序列化,并且可以很容易地重新序列化为一个有效的JSON字符串。这通常意味着它只包含数据(而不包含函数)。这也意味着没有日期,因为JSON没有日期类型(可能是JSON中最痛苦的事情;)
Furthermore, (side-rant...) when people talk about a "JSON Object", they almost always mean data that has the "curly-braces" at the top-level. This corresponds nicely to a javascript object. However, the JSON spec does not require that there be a single "curly-braces" object at the top-level of a JSON string. It is perfectly valid JSON to have a list at the top-level, or even to have just a single value. So, while every "JSON Object" corresponds to valid JSON, not all valid JSON strings correspond to what we would call a "JSON Object"! ( because the string could represent a list or an atomic value )
对于那些仍然认为RFC比博客和基于观点的误解更重要的人,让我们试着澄清一些观点。 我不打算重复之前的答案中已经提到的所有正确的差异,这里我只是试图增加总结一些关键部分rfc7159的价值
摘自https://www.rfc-editor.org/rfc/rfc7159
JavaScript Object Notation (JSON) is a text format for the serialization of structured data. It is derived from the object literals of JavaScript, as defined in the ECMAScript Programming Language Standard, Third Edition [ECMA-262]. JSON can represent four primitive types (strings, numbers, booleans, and null) and two structured types (objects and arrays). An object is an unordered collection of zero or more name/value pairs, where a name is a string and a value is a string, number, boolean, null, object, or array. begin-object = ws %x7B ws ; { left curly bracket end-object = ws %x7D ws ; } right curly bracket A JSON value MUST be an object, array, number, or string, or one of the following three literal names: false null true An object structure is represented as a pair of curly brackets The names within an object SHOULD be unique. object = begin-object [ member *( value-separator member ) ] end-object An object whose names are all unique is interoperable in the sense that all software implementations receiving that object will agree on the name-value mappings. When the names within an object are not unique, the behavior of software that receives such an object is unpredictable. Examples (from page 12 of RFC) This is a JSON object:
{ "图像":{ “宽度”:800年, “高度”:600年, “标题”:“从15楼看”, “缩略图”:{ “Url”:“http://www.example.com/image/481989943”, “高度”:125年, “宽度”:100 }, "Animated": false, " id ": [116, 943, 234, 38793] } }
它的Image成员是一个对象,其Thumbnail成员是一个对象和 它的id成员是一个数字数组。
实际上没有所谓的“JSON对象”。
真的吗?
首先你应该知道JSON是什么:
它是与语言无关的数据交换格式。 JSON的语法受到JavaScript Object Literal表示法的启发,但它们之间存在差异。
例如,在JSON中,所有的键都必须加引号,而在对象文字中则不需要这样做:
/ / JSON: {"foo": "bar"}
//对象文字: Var o = {foo: "bar"}; 引号在JSON中是强制的,因为在JavaScript中(更确切地说在ECMAScript 3rd中)。Edition),不允许使用保留字作为属性名,例如:
Var o = {if: "foo"};// ES3中的SyntaxError 然而,使用字符串文字作为属性名(引用属性名)没有问题:
Var o = {"if": "foo"}; 所以为了“兼容性”(和容易评估可能?)引号是强制性的。
JSON中的数据类型也仅限于以下值:
字符串 数量 对象 数组 字面意思为: 真正的 假 零 字符串的语法改变了。它们必须用双引号分隔,而在JavaScript中,可以交替使用单引号或双引号。
//无效JSON: {"foo": 'bar'} 数字的公认JSON语法也会发生变化,在JavaScript中,你可以使用十六进制文字,例如0xFF,或(臭名昭著的)八进制文字,例如010。在JSON中,你只能使用十进制文字。
//无效JSON: {"foo": 0xFF}
Javascript对象文字vs JSON:
对象文字语法是创建javascript对象的一种非常方便的方法 JSON语言,代表“Javascript对象符号”,其语法源自Javascript对象文字语法。它被用作独立于编程语言的文本数据传输格式。
例子:
JS对象表示法,用于在JS中方便地创建代码中的对象:
const JS_Object = {
1: 2, // the key here is the number 1, the value is the number 2
a: 'b', // the key is the string a, the value is the string b
func: function () { console.log('hi') }
// the key is func, the value is the function
}
JSON示例:
{"widget": {
"debug": "on",
"window": {
"title": "Sample Konfabulator Widget",
"name": "main_window",
"width": 500,
"height": 500
},
"image": {
"src": "Images/Sun.png",
"name": "sun1",
"hOffset": 250,
"vOffset": 250,
"alignment": "center"
},
"text": {
"data": "Click Here",
"size": 36,
"style": "bold",
"name": "text1",
"hOffset": 250,
"vOffset": 100,
"alignment": "center",
"onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
}
}}
主要差异:
JSON中的所有对象键都必须是字符串。在Javascript中,对象键可以是字符串或数字 JSON中的所有字符串都必须使用双引号。而在Javascript中,单引号和双引号都是允许的。即使Javascript对象表示法中没有引号,对象键也隐式地转换为字符串。 在JSON中,函数不能被定义为对象的值(因为这是Javascript特有的)。在Javascript中,这是完全合法的。
Javascript构建JSON对象:
JSON对象可以很容易地转换为Javascript,反之亦然,使用Javascript在其运行时提供的内置JSON对象。例如:
const对象= { property1:没错, property2:假的, };//使用JS对象文字语法创建对象 const JSON_object = JSON.stringify(对象);// stringify JS对象为JSON字符串 console.log (JSON_object);//注意(字符串)键在双引号中 const JS_object = JSON.parse(JSON_object);//解析JSON字符串到JS对象 console.log (JS_object。property1 JS_object.property2); //访问新创建对象的键