有人能告诉我使用“Object Literal Notation”和 JSON对象定义的JavaScript对象之间的主要区别是什么?
根据一本JavaScript书,它说这是一个使用 Object Notation 定义的对象:
var anObject = {
property1 : true,
showMessage : function (msg) { alert(msg) }
};
为什么在这种情况下它不是JSON对象?仅仅因为它没有使用引号定义?
答案 0 :(得分:235)
让我们首先澄清JSON实际上是什么。 JSON是一种文本,与语言无关的数据交换格式,非常类似于XML,CSV或YAML。
数据可以以多种方式存储,但如果它应存储在文本文件中并且可由计算机读取,则需要遵循某种结构。 JSON是定义这种结构的众多格式之一。
此类格式通常与语言无关,这意味着它们可以通过Java,Python,JavaScript,PHP进行处理。
相比之下, JavaScript 是一种编程语言。当然JavaScript也提供了一种定义/描述数据的方法,但语法非常特定于JavaScript。
作为反例,Python具有元组的概念,其语法为(x, y)
。 JavaScript没有这样的东西。
让我们看看JSON和JavaScript对象文字之间的语法差异。
JSON具有以下语法约束:
"
括起来的字符序列)。 true
false
null
{"foo":"bar","foo":"baz"}
)产生未定义的,特定于实现的结果; JSON规范明确没有定义它们的语义在JavaScript中,对象文字可以有
undefined
。知道,只是看一下语法,你的例子不是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看起来类似,这并不意味着您可以互换地命名它们。另请参阅There's no such thing as a "JSON Object"。
答案 1 :(得分:39)
JSON的语法更为有限,包括:
"
而不是'
答案 2 :(得分:13)
实际上没有“JSON对象”这样的东西。
JSON规范是将数据编码为字符串的语法。人们称之为“JSON对象”(在javascript中)实际上只是一个普通的javascript对象,它(可能)已经从有效的JSON字符串反序列化,并且可以很容易地重新序列化为有效的JSON字符串。这通常意味着它只包含数据(而不是函数)。这也意味着没有日期,因为JSON没有日期类型(可能是关于JSON最痛苦的事情;)
此外,(侧面咆哮......)当人们谈论“JSON对象”时,他们几乎总是指在顶层有“花括号”的数据。这很好地对应于javascript对象。但是,JSON规范不要求在JSON字符串的顶层有一个“花括号”对象。在顶层有一个列表,甚至只有一个值,这是完全有效的JSON。因此,虽然每个“JSON对象”对应于有效的JSON,但并非所有有效的JSON字符串都对应于我们称之为“JSON对象”的东西! (因为字符串可以表示列表或原子值)
答案 3 :(得分:9)
JSON是对象的subset JavaScript的字面符号。
换句话说,有效的JSON也是有效的JavaScript对象文字符号,但不一定是相反的。
除了阅读documentation之外,正如@Filix King建议的那样,我还建议玩JSONLint online JSON validator。这就是我了解到JSON对象的键必须是字符串的方式。
答案 4 :(得分:2)
对于仍然认为RFC比博客和基于意见的误解更重要的人,让我们尝试回答澄清一些观点。 我不打算重复前面回答中已经提到的所有正确差异,这里我只是尝试添加一些关键部分rfc7159
https://tools.ietf.org/html/rfc7159提取
示例(来自RFC的第12页)
这是一个JSON对象:
{ "Image": { "Width": 800, "Height": 600, "Title": "View from 15th Floor", "Thumbnail": { "Url": "http://www.example.com/image/481989943", "Height": 125, "Width": 100 }, "Animated" : false, "IDs": [116, 943, 234, 38793] } }
其Image成员是对象,其缩略图成员是对象, 其ID成员是一个数字数组。
实际上没有" JSON对象"。
<强>真的吗
答案 5 :(得分:1)
据我所知,主要区别在于 灵活性 。
JSON是“JavaScript Object Notation”的一种包装器,它强制用户遵守更严格的规则来定义对象。它通过限制JavaScript Object Notation功能提供的可能的对象声明方式来实现这一点。
因此,我们有一个更简单,更标准化的对象,更适合平台之间的数据交换。
基本上,我上面例子中的newObject是一个使用JavaScript Objeect Notation定义的对象;但它不是“有效的”JSON对象,因为它不符合JSON标准要求的规则。
此链接也非常有用: http://msdn.microsoft.com/en-us/library/bb299886.aspx
答案 6 :(得分:0)
首先你应该知道JSON是什么:
它是与语言无关的数据交换格式。 JSON的语法受JavaScript Object Literal表示法的启发,但它们之间存在差异。
例如,在JSON中,必须引用所有键,而在对象文字中,这不是必需的:
// JSON: {&#34; foo&#34;:&#34; bar&#34; }
//对象文字: var o = {foo:&#34; bar&#34; }; 引号在JSON上是必需的,因为在JavaScript中(更准确地说,在ECMAScript 3rd。版本中),不允许使用保留字作为属性名称,例如:
var o = {if:&#34; foo&#34; }; // ES3中的SyntaxError 而使用字符串文字作为属性名称(引用属性名称)不会产生任何问题:
var o = {&#34; if&#34;:&#34; foo&#34; }; 所以对于&#34;兼容性&#34; (并且易于评估?)引号是强制性的。
JSON中的数据类型也限制为以下值:
的字符串 数 宾语 排列 文字为: 真正 假 空值 字符串的语法会发生变化。它们必须用双引号分隔,而在JavaScript中,您可以互换使用单引号或双引号。
//无效的JSON: {&#34; foo&#34;:&#39; bar&#39; } 接受的JSON语法也会发生变化,在JavaScript中你可以使用Hexadecimal Literals,例如0xFF,或者(臭名昭着的)Octal Literals,例如: 010.在JSON中,您只能使用十进制文字。
//无效的JSON: {&#34; foo&#34;:0xFF}
答案 7 :(得分:0)
JSON
语言代表“ Java语言对象符号”,其语法派生自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中,不能将函数定义为对象的值(因为它是Java特定的)。在Javascript中,这是完全合法的。
内置于JSON
对象中的Javascript:
JSON
对象,可以轻松将 JSON
对象转换为Javascript,反之亦然。例如:
const Object = {
property1: true,
property2: false,
}; // creating object with JS object literal syntax
const JSON_object = JSON.stringify(Object); // stringify JS object to a JSON string
console.log(JSON_object); // note that the (string) keys are in double quotes
const JS_object = JSON.parse(JSON_object); // parse JSON string to JS object
console.log(JS_object.property1, JS_object.property2);
// accessing keys of the newly created object
答案 8 :(得分:-1)
这是一个令人惊讶的区别:您不能在json中使用undefined
,并且所有具有未定义值的对象字段都将在JSON.stringify
之后消失
let object = { "a": undefined } ;
let badJSON= '{ "a": undefined }';
console.log('valid JS object :', object );
console.log('JSON from object:', JSON.stringify(object) );
console.log('invalid json :', JSON.parse(badJSON) );