【问题标题】:What are the differences between JSON and JavaScript object? [duplicate]JSON 和 JavaScript 对象有什么区别? [复制]
【发布时间】:2011-04-27 21:54:49
【问题描述】:

我是 JSON 和 JavaScript 对象的新手。

  • 谁能解释一下 JSON 和 JavaScript 对象之间的区别?
  • 它们有什么用途?
  • 一种比另一种更好吗?还是视情况而定?
  • 什么时候使用哪个,在什么情况下?
  • 为什么首先创建 JSON?它的主要目的是什么?
  • 谁能举例说明何时应该使用 JSON 而不是 JavaScript 对象,反之亦然?

【问题讨论】:

  • 请一次一个问题。
  • @LightnessRacesinOrbit 不错的尝试
  • @FélixGagnon-Grenier 谢谢

标签: javascript json javascript-objects


【解决方案1】:

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

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

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

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

// 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' }

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

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

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

【讨论】:

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

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

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

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

【讨论】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 2020-09-28
    • 2011-07-31
    • 2012-01-19
    • 2019-02-09
    相关资源
    最近更新 更多