让我们先澄清一下 JSON 到底是什么。JSON是一种文本,与语言无关的数据交换格式,非常类似于XML,CSV或YAML。
数据可以通过多种方式存储,但如果它应该存储在文本文件中并由计算机读取,则需要遵循某种结构。JSON是定义此类结构的众多格式之一。
这些格式通常是与语言无关的,这意味着它们可以由Java,Python,JavaScript,PHP来处理。
相比之下,JavaScript是一种编程语言。当然,JavaScript也提供了一种定义/描述数据的方法,但语法非常特定于JavaScript。
作为反例,Python具有元组的概念,它们的语法是。JavaScript没有这样的东西。(x, y)
让我们看一下 JSON 和 JavaScript 对象文本之间的语法差异。
JSON 具有以下语法约束:
- 对象键必须是字符串(即用双引号括起来的字符序列)。
"
- 这些值可以是:
- 字符串
- 一个数字
- 一个 (JSON) 对象
- 数组
true
false
null
- 重复的键 () 产生未定义的、特定于实现的结果;JSON规范没有明确定义它们的语义
{"foo":"bar","foo":"baz"}
在 JavaScript 中,对象文本可以具有
- 字符串文本,数字文本或标识符名称作为键(从ES6开始,现在也可以计算键,这引入了另一种语法)。
- 这些值可以是任何有效的 JavaScript 表达式,包括函数定义和 .
undefined
- 重复的键会产生定义的指定结果(在松散模式下,后者的定义取代了前者;在严格模式下,这是一个错误)。
知道了这一点,仅通过查看语法,您的示例不是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 对象”这样的东西。