2010-10-20 93 views
89

我是JSON和JavaScript对象的新手。JSON和JavaScript对象之间有什么区别?

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

请一次提出一个问题。 – 2011-12-09 18:11:49

+0

[JSON和Object Literal Notation之间的区别是什么?](http://stackoverflow.com/questions/2904131/what-is-the-difference-between-json-and-object-literal-notation) – Teepeemm 2015-06-12 15:09:30

回答

131

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

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

JSON的语法灵感来自JavaScript Object Literal符号​​,但它们之间存在差异。

例如,在JSON所有必须被引用,而对象文本,这是没有必要的:

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

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

的引号是强制的JSON,因为在JavaScript(ECMAScript中第三个更准确地版。 ),的保留字作为属性名称的使用不被允许,例如:

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

虽然,使用一个字符串文字作为属性名称(引用的亲perty名)没有给出问题:

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

所以对于“兼容性”(易eval'ing可能)的报价是强制性的?

在JSON的数据类型也被限制为以下值:

  • string
  • number
  • object
  • array
  • 一个文字为:
    • true
    • false
    • null

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

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

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

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

有一些手推车实施方案(火狐3.5+ IE8 +,json2.js),其中八进制文字被错误地允许的,例如JSON.parse('01')应产生一个SyntaxError

+34

+1好的答案,但可以强调子集:可以使用任何有效的JSON声明也是有效的JavaScript声明,但并非所有有效的JavaScript声明都是JSON声明。 – 2010-10-20 08:26:00

+1

对于展示我们在Javascript文件中看到JSON的唯一方式也是有帮助的;即在一个字符串内。 – 2011-12-09 18:12:49

+0

@CMS在上面完全描述了它,但我会说你可以通过JSON实际上代表什么来区别它们......这就是JavaScript Oject“Notation”! – Alex 2010-10-20 08:20:09

21

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

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

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

+3

不要让Crockford听到你说... – nickf 2010-10-20 08:34:48

+4

@nickf,Crockford的json2.js库只是做了一些“正则表达式验证”后的'eval',它没有做任何*解析*:P。事实上,即使他自己的图书馆*也有[他自己的RFC](http://www.ietf.org/rfc/rfc4627.txt?number=4627)的一些偏差!例如,json2.js可能错误地“解析“八进制文字,例如:'JSON.parse(”01“)'...我觉得很有趣:P – CMS 2010-10-20 08:46:35

+0

@CMS好吧,我想道格会反对”简单地''eval()'“这个短语。 (无正则表达式验证等) – nickf 2010-10-20 10:52:14

1

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

使用JSON作为数据交换格式,您可以用文本形式交换结构化数据。到目前为止,它与JavaScript非常不兼容。 JavaScript对象允许您在执行JavaScript程序期间创建和使用结构化数据。

相关问题