天天看點

【Android】json格式詳解

JSON有兩種結構

  1. “名稱/值”對的集合(A collection of name/value pairs)。

      不同的語言中,它被了解為對象(object),記錄(record),結構(struct),字典(dictionary),哈希表(hash table),有鍵清單(keyed list),或者關聯數組 (associative array)。

  2.值的有序清單(An ordered list of values)。在大部分語言中,它被了解為數組(array)。

 基礎示例

  簡單地說,JSON 可以将 JavaScript 對象中表示的一組資料轉換為字元串,然後就可以在函數之間輕松地傳遞這個字元串,或者在異步應用程式中将字元串從 Web 客戶機傳遞給伺服器端程式。這個字元串看起來有點兒古怪,但是 JavaScript 很容易解釋它,而且 JSON 可以表示比"名稱 / 值對"更複雜的結構。例如,可以表示數組和複雜的對象,而不僅僅是鍵和值的簡單清單。

表示名稱 / 值對

  按照最簡單的形式,可以用下面這樣的 JSON 表示"名稱 / 值對":

  { "firstName": "Brett" } 

  這個示例非常基本,而且實際上比等效的純文字"名稱 / 值對"占用更多的空間:

  firstName=Brett 

  但是,當将多個"名稱 / 值對"串在一起時,JSON 就會展現出它的價值了。首先,可以建立包含多個"名稱 / 值對"的 記錄,比如:

  { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" } 

  從文法方面來看,這與"名稱 / 值對"相比并沒有很大的優勢,但是在這種情況下 JSON 更容易使用,而且可讀性更好。例如,它明确地表示以上三個值都是同一記錄的一部分;花括号使這些值有了某種聯系。

表示數組

  當需要表示一組值時,JSON 不但能夠提高可讀性,而且可以減少複雜性。例如,假設您希望表示一個人名清單。在 XML 中,需要許多開始标記和結束标記;如果使用典型的名稱 / 值對(就像在本系列前面文章中看到的那種名稱 / 值對),那麼必須建立一種專有的資料格式,或者将鍵名稱修改為 person1-firstName這樣的形式。

  如果使用 JSON,就隻需将多個帶花括号的記錄分組在一起:

  { "people": [ 

  { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, 

  { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"}, 

  { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" } 

  ]} 

  這不難了解。在這個示例中,隻有一個名為 people的變量,值是包含三個條目的數組,每個條目是一個人的記錄,其中包含名、姓和電子郵件位址。上面的示例示範如何用括号将記錄組合成一個值。當然,可以使用相同的文法表示多個值(每個值包含多個記錄):

  { "programmers": [

  { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" }, 

  { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }

  ],

  "authors": [ 

  { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, 

  { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }, 

  { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" } 

  ], 

  "musicians": [ 

  { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }, 

  { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } 

  ] } 

  這裡最值得注意的是,能夠表示多個值,每個值進而包含多個值。

  但是還應該注意,在不同的主條目(programmers、authors 和 musicians)之間,記錄中實際的名稱 / 值對可以不一樣。JSON 是完全動态的,允許在 JSON 結構的中間改變表示資料的方式。

  在處理 JSON 格式的資料時,沒有需要遵守的預定義的限制。是以,在同樣的資料結構中,可以改變表示資料的方式,甚至可以以不同方式表示同一事物。

 格式應用

  掌握了 JSON 格式之後,在 JavaScript 中使用它就很簡單了。JSON 是 JavaScript 原生格式,這意味着在 JavaScript 中處理 JSON 資料不需要任何特殊的 API 或工具包。

将 JSON 資料指派給變量

  例如,可以建立一個新的 JavaScript 變量,然後将 JSON 格式的資料字元串直接指派給它:

  var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }, 

  這非常簡單;現在 people包含前面看到的 JSON 格式的資料。但是,這還不夠,因為通路資料的方式似乎還不明顯。

通路資料

  盡管看起來不明顯,但是上面的長字元串實際上隻是一個數組;将這個數組放進 JavaScript 變量之後,就可以很輕松地通路它。

  實際上,隻需用點号表示法來表示數組元素。是以,要想通路 programmers 清單的第一個條目的姓氏,隻需在 JavaScript 中使用下面這樣的代碼:

  people.programmers[0].lastName; 

  注意,數組索引是從零開始的。是以,這行代碼首先通路 people變量中的資料;然後移動到稱為 programmers的條目,再移動到第一個記錄([0]);最後,通路 lastName鍵的值。結果是字元串值 “McLaughlin”。

  下面是使用同一變量的幾個示例。

  people.authors[1].genre // Value is "fantasy" 

  people.musicians[3].lastName // Undefined. This refers to the fourth entry, and there isn't one 

  people.programmers[2].firstName // Value is "Elliotte" 

  利用這樣的文法,可以處理任何 JSON 格式的資料,而不需要使用任何額外的 JavaScript 工具包或 API。

修改 JSON 資料

  正如可以用點号和括号通路資料,也可以按照同樣的方式輕松地修改資料:

  people.musicians[1].lastName = "Rachmaninov"; 

  在将字元串轉換為 JavaScript 對象之後,就可以像這樣修改變量中的資料。

轉換回字元串

  當然,如果不能輕松地将對象轉換回本文提到的文本格式,那麼所有資料修改都沒有太大的價值。在 JavaScript 中這種轉換也很簡單:

  String newJSONtext = people.toJSONString(); 

  這樣就行了!現在就獲得了一個可以在任何地方使用的文本字元串,例如,可以将它用作 Ajax 應用程式中的請求字元串。

  更重要的是,可以将 任何JavaScript 對象轉換為 JSON 文本。并非隻能處理原來用 JSON 字元串指派的變量。為了對名為 myObject的對象進行轉換,隻需執行相同形式的指令:

  String myObjectInJSON = myObject.toJSONString(); 

  這就是 JSON 與本系列讨論的其他資料格式之間最大的差異。如果使用 JSON,隻需調用一個簡單的函數,就可以獲得經過格式化的資料,可以直接使用了。對于其他資料格式,需要在原始資料和格式化資料之間進行轉換。即使使用 Document Object Model 這樣的 API(提供了将自己的資料結構轉換為文本的函數),也需要學習這個 API 并使用 API 的對象,而不是使用原生的 JavaScript 對象和文法。

  最終結論是,如果要處理大量 JavaScript 對象,那麼 JSON 幾乎肯定是一個好選擇,這樣就可以輕松地将資料轉換為可以在請求中發送給伺服器端程式的格式。

 具體形式

  1、對象是一個無序的“‘名稱/值’對”集合。一個對象以“{”(左括号)開始,“}”(右括号)結束。每個“名稱”後跟一個“:”(冒号);“‘名稱/值’ 對”之間使用“,”(逗号)分隔。(如圖所示,圖中表示資料的方式是類似非确定性自動機的形式,沒學過編譯原理的人,可能了解起來困難點,實際上也是正規表達式的形式。下同) 

  

2、數組是值(value)的有序集合。一個數組以“[”(左中括号)開始,“]”(右中括号)結束。值之間使用“,”(逗号)分隔。

3、值(value)可以是雙引号括起來的字元串(string)、數值(number)、true、false、 null、對象(object)或者數組(array)。這些結構可以嵌套。 

 

4、字元串(string)是由雙引号包圍的任意數量Unicode字元的集合,使用反斜線轉義。一個字元(character)即一個單獨的字元串(character string)。 字元串(string)與C或者Java的字元串非常相似。

5、數值(number)也與C或者Java的數值非常相似。除去未曾使用的八進制與十六進制格式。除去一些編碼細節。

JSON格式:http://www.json.org/

QQ聯系方式:[email protected]

出處:lcw.cnblogs.com

郵箱:[email protected]

本文申明:本文版權歸作者和部落格園共有,歡迎轉載,轉載請注明出處.