Javascript JSON和对象文字符号有什么区别?
有人能告诉我使用对象文字符号定义的JavaScript对象和JSON对象之间的主要区别吗Javascript JSON和对象文字符号有什么区别?,javascript,json,object-notation,Javascript,Json,Object Notation,有人能告诉我使用对象文字符号定义的JavaScript对象和JSON对象之间的主要区别吗 根据一本JavaScript书,它说这是一个使用对象符号定义的对象: 为什么在这种情况下它不是JSON对象?仅仅因为它不是用引号来定义的吗?让我们先澄清一下它实际上是什么。JSON是一种文本、独立于语言的数据交换格式,非常类似于XML、CSV或YAML 数据可以以多种方式存储,但如果数据应该存储在文本文件中,并且计算机可以读取,则需要遵循某种结构。JSON是定义这种结构的多种格式之一 这些格式通常是独立于语
根据一本JavaScript书,它说这是一个使用对象符号定义的对象:
为什么在这种情况下它不是JSON对象?仅仅因为它不是用引号来定义的吗?让我们先澄清一下它实际上是什么。JSON是一种文本、独立于语言的数据交换格式,非常类似于XML、CSV或YAML
数据可以以多种方式存储,但如果数据应该存储在文本文件中,并且计算机可以读取,则需要遵循某种结构。JSON是定义这种结构的多种格式之一
这些格式通常是独立于语言的,这意味着它们可以由Java、Python、JavaScript、PHP等处理
相反,JavaScript是一种编程语言。当然,JavaScript也提供了一种定义/描述数据的方法,但语法非常特定于JavaScript
作为反例,Python有元组的概念,它们的语法是
(x,y)
。JavaScript没有这样的东西
让我们看看JSON和JavaScript对象文本之间的语法差异
JSON具有以下语法约束:
- 对象键必须是字符串(即用双引号括起来的字符序列
)“
- 这些值可以是:
- 一串
- 数
- 一个(JSON)对象
- 阵列
true
false
null
- 重复键(
)会产生未定义的、特定于实现的结果;JSON规范没有明确定义它们的语义{“foo”:“bar”,“foo”:“baz”}
在JavaScript中,对象文本可以具有
- 字符串文字、数字文字或标识符名称作为键(自ES6以来,现在还可以计算键,这引入了另一种语法)
- 这些值可以是任何有效的JavaScript表达式,包括函数定义和未定义的
- 重复的关键点会产生定义的、指定的结果(在松散模式下,后一个定义将替换前者;在严格模式下,这是一个错误)
要知道,只要看一下语法,您的示例就不是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是一种“JavaScript对象表示法”的包装器,它强制用户遵守更严格的对象定义规则。它通过限制JavaScript对象标记特性提供的可能的对象声明方式来实现这一点
因此,我们有一个更简单、更标准化的对象,它更适合于平台之间的数据交换
因此,基本上,我上面示例中的newObject是使用JavaScript对象表示法定义的对象;但它不是一个“有效”的JSON对象,因为它不遵循JSON标准要求的规则
此链接也非常有用:
根据
JSON是对象的一个属性 JavaScript的文字符号
换句话说,有效的JSON也是有效的JavaScript对象文字符号,但不一定相反
正如@Filix King所建议的,除了阅读这些内容外,我还建议大家玩一下。这就是我了解到JSON对象的键必须是字符串的原因。实际上没有“JSON对象”这样的东西
JSON规范是将数据编码为字符串的语法。人们所谓的“JSON对象”(javascript)实际上只是一个普通的javascript对象,它(可能)已从有效的JSON字符串反序列化,并且可以轻松地重新序列化为有效的JSON字符串。这通常意味着它只包含数据(而不包含函数)。这还意味着没有日期,因为JSON没有日期类型(可能是JSON最痛苦的事情;)
此外,(旁白…)当人们谈论“JSON对象”时,他们几乎总是指在顶层有“花括号”的数据。这相当于一个javascript对象。然而,JSON规范并不要求JSON字符串的顶层有一个“花括号”对象。在顶层有一个列表,甚至只有一个值,这是非常有效的JSON。因此,虽然每个“JSON对象”都对应于有效的JSON,但并非所有有效的JSON字符串都对应于我们所谓的“JSON对象”!(因为字符串可以表示一个列表或一个原子值)对于那些仍然认为RFC比博客和基于观点的误解更重要的人,让我们尝试回答澄清一些问题。 我不会重复所有正确的区别
var obj = {foo: 42}; // creates a JavaScript object (this is *not* JSON)
var json = '{"foo": 452}'; // creates a string containing 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]
}
}
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
}