JSON 和 JavaScript 对象有什么区别?

IT技术 javascript json javascript-objects
2021-02-06 15:54:58

我是 JSON 和 JavaScript 对象的新手。

  • 有人可以解释一下 JSON 和 JavaScript 对象之间的区别吗?
  • 它们的用途是什么?
  • 这个比那个好吗?还是视情况而定?
  • 什么时候用,什么情况下?
  • 为什么首先创建 JSON?它的主要目的是什么?
  • 有人可以举例说明何时应该使用 JSON 而不是 JavaScript 对象,反之亦然?
3个回答

首先你应该知道什么是 JSON:

  • 它是与语言无关的数据交换格式。

JSON 的语法受到 JavaScript Object Literal 表示法的启发,但它们之间存在差异。

例如,在 JSON 中,所有键都必须被引用,而在对象文字中,这不是必需的:

// JSON:
{ "foo": "bar" }

// Object literal:
var o = { foo: "bar" };

JSON 上的引号是强制性的,因为在 JavaScript(更确切地说是在 ECMAScript 3rd. Edition 中)中,不允许使用保留字作为属性名称,例如:

var o = { if: "foo" }; // SyntaxError in ES3

虽然,使用字符串文字作为属性名称(引用属性名称)没有问题:

var o = { "if": "foo" }; 

因此,对于“兼容性”(可能是简单的评估?),引号是强制性的。

JSON 中的数据类型也仅限于以下值:

  • string
  • number
  • object
  • array
  • 文字如下:
    • true
    • false
    • null

Strings变化的语法它们必须双引号分隔,而在 JavaScript 中,您可以交替使用单引号或双引号。

// Invalid JSON:
{ "foo": 'bar' }

接受的 JSON 语法Numbers也发生了变化,在 JavaScript 中,您可以使用十六进制文字,例如0xFF,或(臭名昭著的)八进制文字,例如010在 JSON 中,您只能使用十进制文字。

// Invalid JSON:
{ "foo": 0xFF }

有一些错误的实现(Firefox 3.5+、IE8+、json2.js)其中八进制文字被错误地允许,例如JSON.parse('01')应该产生一个SyntaxError.

@DanielEarwicker:并非所有有效的 JSON 都必须是 javascript 中的有效对象表达式:timelessrepo.com/json-isnt-a-javascript-subset某些 unicode 空白字符在 json 字符串中有效,但在 javascript 中无效。
2021-03-18 15:54:58
+1 很好的答案,但可以强调子集:任何有效的 JSON 声明也是有效的 JavaScript 声明,但并非所有有效的 JavaScript 声明都是 JSON 声明。
2021-03-21 15:54:58
也有助于演示我们在 Javascript 文件中看到 JSON 的唯一方式;即在一个字符串内。
2021-03-31 15:54:58
这是一个潜在的 crashbug 问题,因为如果攻击者嵌入\u2028字符并且您的(有效)json 序列化程序没有对它们进行转义(因为没有必要),任何字面上包含 json 文字并将其评估为 JS 对象的页面可能会遇到异常. 很容易修复;在序列化程序级别,但它不是一个适当的子集是一种痛苦 - 然后您可以可靠地将(有效)json 嵌入到 javascript 中而没有风险。这主要是烦人的,仅此而已-授予:-)。
2021-04-03 15:54:58
@EamonNerbonne - 如该页面所述,在它(很少)导致问题的唯一情况下非常容易修复。
2021-04-08 15:54:58

JSON 是对象的字符串表示形式。它是一种可互操作的序列化格式。它不仅与 javascript 相关。例如,有用于 .NET 的 JSON 序列化程序,允许您序列化/反序列化 .NET 对象。

因此,它只是一种允许您将对象转换为字符串并返回的格式,如果您想通过网络传输它们,这很方便。

它非常接近 javascript 对象表示,如果您只是eval()一个 JSON 字符串,您将获得相应的对象。

不要让克罗克福德听到你说...
2021-03-12 15:54:58
@nickf,Crockford 的 json2.js 库就是这样做的,eval经过一些“正则表达式验证”,它不做任何解析:P。事实上,即使他自己的库也与他自己的 RFC有一些偏差!,例如,json2.js 可以错误地“解析”八进制文字,例如:JSON.parse("01")...我觉得很有趣 :P
2021-04-03 15:54:58
@CMS好吧,我猜Doug会反对“简单eval()这个短语然后......(没有正则表达式验证等等)
2021-04-04 15:54:58
所以如果我只是用 JavaScript 编写一个需要使用对象的程序,我不应该使用 JSON,因为我没有将对象发送到其他地方?
2021-04-05 15:54:58

JSON 是一种数据交换格式,它恰好看起来像是 YAML 或 JavaScript 代码的子集,您可以执行并取回对象。JavaScript 对象只是 JavaScript 中的一个对象。

JSON 是一种数据交换格式,您可以与它交换文本形式的结构化数据。现在它已经与 JavaScript 分离了。JavaScript 对象允许您在 JavaScript 程序执行期间创建和使用结构化数据。