2010-10-20 157 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程序期間創建和使用結構化數據。

相關問題