1. 程式人生 > >JSON格式介紹和使用cJSON解析

JSON格式介紹和使用cJSON解析

轉自:http://hi.baidu.com/xp2xp3/item/c1ff4f1c2ed37adf9c778ab9

在閱讀本文之前,請先閱讀下《Rss Reader例項開發之系統設計》一文。

Rss Reader例項開發中,進行網路資料交換時主要使用到了兩種資料格式:JSON與XML。本文主要介紹JSON格式的簡單概念及JSON在Rss Reader中的應用,XML格式的使用將在下一篇文章做介紹。
 

JSON簡介:


JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,可以把JSON的結構理解成無序的、可巢狀的key-value鍵值對集合,這些key-value鍵值對是以結構體或陣列的形式來組織的。同一級的key-value鍵值對之間是用一個“,”(逗號)隔開,每個key-value鍵值對是由一個key後面緊接一個“:”(冒號),冒號後面是這個key對應的value。Key是一個word,由大小寫字母、下劃線及數字組成,可以由雙引號封閉,也可以不加雙引號;而value的取值集為:Number、Boolean(true或false)、null、String、Object及Array,如圖一:


 
(圖一)
 

1、Number:數值,包括整形數與浮點數,如:123、0.83、-2.7e10。其結構如圖二:


(圖二)

2、String:字串,是以雙引號封閉起來的一串字元,使用反斜槓來轉義,如:\\、\n等,JSON中字串的概念與C/C++或者JAVA語言裡的字串概念差不多,如:”abc”。其結構如圖三:


(圖三)

3、Object:物件,也可理解成一個結構體,是以一對大括號封閉起來的無序的key-value鍵值對集合,例如:{name:"Susan", age:27, birthday:{year:1984, month:2, day:11}};也可以寫成:{"name":"Susan", "age":27, "birthday":{"year":1984, "month":2, "day":11}};其結構如圖四:


(圖四)

4、Array:陣列,JSON的陣列是一個以中括號封閉起來的value的集合,即陣列內的各個成員的資料型別可以不一樣,這一點就跟C/JAVA的陣列概念不同了。每個value之間是由一個“,”(逗號)隔開,例如:[123, abc, false, {name:mj}];其結構如圖五:

 
(圖五)


關於JSON的詳細說明與教程請自行到網路上搜索,有很多。
 

下面我們就來動手寫一個例子:

  1. {
  2.     result:true,
  3.     root:{
  4.         version:"201007091640",
  5.         channels:[
  6.         {
  7.             name:"新聞中心",
  8.             subchnls:[
  9.             {
  10.                 title:"焦點新聞",
  11.                 link:"http://news.mtc.sohu.com/news/channel/1/news.rss",
  12.                 desc:"家事、國事、天下事"
  13.             },
  14.             {
  15.                 title:"新聞頻道",
  16.                 link:"http://news.mtc.sohu.com/news/channel/2/news.rss",
  17.                 desc:"讓您實時掌握國際動態"
  18.             },
  19.             {
  20.                 title:"軍事頻道",
  21.                 link:"http://news.mtc.sohu.com/news/channel/3/news.rss",
  22.                 desc:"軍事"
  23.             }
  24.             ]
  25.         },
  26.         {
  27.             name:"體育新聞",
  28.             subchnls:[
  29.             {
  30.                 title:"體育要聞彙總",
  31.                 link:"http://news.mtc.sohu.com/news/channel/4/news.rss",
  32.                 desc:"erewr"
  33.             },
  34.             {
  35.                 title:"國際足壇",
  36.                 link:"http://news.mtc.sohu.com/news/channel/5/news.rss",
  37.                 desc:"werewr"
  38.             }
  39.             ]
  40.         }
  41.         ]
  42.     }
  43. }


這段JSON描述了一個物件(最外層大括號包圍的部分),為了方便區分,我們就將其稱為物件A吧。物件A有兩個Item(即key-value鍵值對),一個是result,其值為true;一個是root,其值為一個物件,稱為物件B。物件B也有兩個Item,一個是version,其值為一個字串” 201007091640”;一個是channels,其值是一個數組,而陣列的成員都是一個物件,每個物件又包含兩個Item,一個是name,值分別為字串"新聞中心"和"體育新聞";一個是subchnls,值都是陣列,每個陣列又分別有若干個成員,每個subchnls成員也都是一個物件,每個物件都有三個Item:title、link和desc。也許你看到這,已經是一頭大汗了,不過沒關係,我們來帖張這段JSON文字對應的結構圖,有圖就有真相,請看圖六:


(圖六:黑色實線為物件,虛線為值,橙色實線為陣列)

在RssReader中使用cJSON:


在RssReader中使用了開源庫cJSON來解析JSON,所以在此就介紹下cJSON的使用:

在CJSON中,一個key-value鍵值對被解析並存放在一個cJSON結構體變數中,其value取值集為:FALSE,TRUE,NULL,NUMBER,STRING,OBJECT,ARRAY。它們分別被存放在CJSON物件的child、valuestring、valueint、valuedouble變數中,而用於判斷某個CJSON物件value的資料型別則是CJSON物件的type變數,其取值範圍與CJSON物件的value集是一一對應的,如:cJSON_False對應FALSE。
cJSON Types:  

  1. #define     cJSON_False     0
  2. #define     cJSON_True      1
  3. #define     cJSON_NULL  2
  4. #define     cJSON_Number    3
  5. #define     cJSON_String    4
  6. #define     cJSON_Array     5
  7. #define     cJSON_Object    6

cJSON 結構體:

  1. typedef struct cJSON
  2. {
  3. struct cJSON *next,*prev;   //指向上一項/下一項
  4. struct cJSON *child;