JSON 和对象文本表示法之间有什么区别?

2022-08-30 00:37:12

有人可以告诉我使用对象文本表示法定义的JavaScript对象和JSON对象之间的主要区别是什么吗?

根据一本JavaScript书,它说这是一个使用Object Notation定义的对象

var anObject = {
    property1 : true,
    showMessage : function (msg) { alert(msg) }
};

为什么在这种情况下它不是 JSON 对象?仅仅因为它不是通过使用引号定义的吗?


答案 1

让我们先澄清一下 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,原因有两个:

  1. 您的键不是字符串(文本)。它们是标识符名称
  2. 不能将函数作为值分配给“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 对象”这样的东西


答案 2

JSON具有更有限的语法,包括:

  • 必须引用键值
  • 字符串必须用引号括起来,而不是"'
  • 您的值范围更有限(例如,不允许任何函数)