2014年10月16日 星期四

[JSON] 認識JSON

JSON之前學過了,但其實都在打瞌睡沒學好。這邊記錄網路的資料。

來源:http://j796160836.pixnet.net/blog/post/30530326-瞭解json格式

JSON全名叫做JavaScript Object Notation,就是在JavaScript之中,表示物件的一種格式。

既然是格式,為何這麼多人愛用,可以好好瞭解一下。

JSON格式簡單來說,就是這二句重點:
  1. 物件(object)用大括號{}
  2. 陣列(array)用中括號[]
先記住這概念。

如果你看不懂JSON,可以用類似這種線上JSON格式化的網站


物件(object)
這裡說的object,不管你曾經在哪裡聽過這個名詞,他就是用key-value的方式儲存。來個範例吧!
{ "subject":"Math" , "score":80 }
這就是JSON裡的object
key-value就是指一個鍵值(key)對應一個值(value),跟變數很像,像是subject這個key有個值叫Math、score它的值為80。

官方網站有個迷宮圖,有助於理解。


陣列(array)
陣列可能就比較熟悉些,例如:
[0 ,4 ,5 ,2 ,7 ,8 ,3]
不難理解,就像是之前寫陣列一樣類似,這裡的範例是使用數字,但也可以是文字或者是陣列、物件、null。當然,混合就不用說了,絕對OK。
文字(text)的例子:
[ "Tom", "John", "Amy", "Ivy" ]

布林(boolean):
[ true, true, false, false, true, true ]

硬要用key-value的方式解釋的話,就是0, 1, 2, 3 的照順序的數字。
所以物件和陣列,某方面來說(不考慮資料損失),是可以互相轉換的。

若物件→陣列:
就會損失鍵值(key)的資料,留下值(value),或是程式到時候指定說,要鍵值陣列(key array),就會把所有的鍵值(key)合併一起成陣列。

若陣列→物件
就可以將每個值編上數字。

這裡注意一點:
JSON Object的鍵值(key),一定要用文字做鍵值。

以下是錯誤的:
{ 0:"Tom", 1:"John", 2:"Amy", 3:"Ivy" } //error syntax
正確應改為:
{ "0":"Tom", "1":"John", "2":"Amy", "3":"Ivy" }
而整個JSON格式文件之中,是不能使用註解的。

最後用這二個範例結束吧:

成績單
[
  {
    "name": "Tom",
    "lastname": "Chen",
    "report": {
      "0": {
        "subject": "Math",
        "score": 80
      },
      "1": {
        "subject": "English",
        "score": 90
      }
    }
  },
  {
    "name": "Amy",
    "lastname": "Lin",
    "report": [
      {
        "subject": "Math",
        "score": 86
      },
      {
        "subject": "English",
        "score": 88
      }
    ]
  }
]
看起來很複雜,對吧?其實不難,我們做成大家看得懂的表格:

成績單1
姓名  Tom Chen 
數學 80 
英文  90 
成績單2
姓名  Amy Lin 
數學 86
英文 88 

剛剛也有提到這是個成績單,一開始用一個陣列[]包起來,然後是二個物件{}
[ { …學生1… } , { …學生2… } ]
學生資料內有姓名和成績:
{ "name":"Tom" , "lastname":"Chen" , "report":…成績資料… }
成績的部份。因為有很多成績資料,所以有用陣列[]包起來:
{ "name":"Tom" , "lastname":"Chen" , "report":[ { …成績1… } , { …成績2… } ] }
一個成績資料,也是個物件。
{ "subject":"Math" , "score":80 }
全部拼起來就變成那樣。

--

備註

在JSON的格式中,關於中文或其他非英文的部份,一定要用Unicode encode過,通常這個一般處理JSON的函式庫都會做掉,除非你自己print,自己兜出JSON格式。

像是我是中文就會變成\u6211\u662f\u4e2d\u6587,類似這種\u開頭,接一串數字的東西。

可以用這個工具做轉換(不過一般程式的library會做掉啦,這不用擔心)
http://www.htmlescape.net/stringescape_tool.html

另外有些字元在JSON不能直接打,需要做跳脫的(escape character)在這,有些大家都很熟悉,就不細講了。
\"
\\
\/
\b
\f
\n
\r
\t
這裡有些字碼表供參考:
http://en.wikipedia.org/wiki/List_of_Unicode_characters

最後,練練英文,去JSON官方網站看看吧:
http://www.json.org
可以看到不同語言對於這個資料格式的實作,接下來也會提到實作的部分。

沒有留言:

張貼留言