cJSON學習筆記

1.JSON格式簡述

 

JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。易於人閱讀和編寫,同時也易於機器解析和生成。它基於JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一個子集。 JSON採用徹底獨立於語言的文本格式,可是也使用了相似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成爲理想的數據交換語言。(來自「開源中國」資料)
cJSON是一個超輕巧,攜帶方便,單文件,簡單的能夠做爲ANSI-C標準的JSON解析器。
接觸yeelink平臺以後,慢慢接觸到JSON格式,雖然一些簡單的狀況能夠經過string庫函數解析和組裝JSON數據包,可是如有cJSON庫的幫助,解析和組裝JSON數據包的工做便會變得簡單的多,下面就從兩個例子出發說明cJSON數據包的使用方法。
    【相關博文】

2.JSON結構體

熟悉使用cJSON庫函數可從cJSON結構體入手,cJSON結構體以下所示:
[cpp]  view plain copy 在CODE上查看代碼片 派生到個人代碼片
 
  1. typedef struct cJSON {  
  2.  struct cJSON *next,*prev;   
  3.  struct cJSON *child;   
  4.  int type;   
  5.  char *valuestring;   
  6.  int valueint;  
  7.  double valuedouble;   
  8.  char *string;   
  9. } cJSON;  

幾點說明

1.cJOSN結構體爲一個雙向列表,並可經過child指針訪問下一層。
2.type變量決定數據項類型(鍵的類型),數據項能夠是字符串能夠是整形,也能夠是浮點型。若是是整形值的話可從valueint,若是是浮點型的話可從valuedouble取出,以此類推。
3.string可理解爲節點的名稱,綜合此處的第2點可理解爲「鍵」的名稱。
 

3.解析JSON數據包

例如在yeelink平臺中讀取一個開關量的結果,向yeelink平臺請求以後能夠得到如下JSON數據包:
{"timestamp":"2013-11-19T08:50:11","value":1}
在這個JSON數據包中有兩個數據項(鍵值對),一個是時間戳,該時間戳爲字符串形式;另外一個是開關值,該開關值爲整型。 該例子主要用於模擬向yeelink平臺請求開關量數據。

參考代碼

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include "cJSON.h"
 4 // 被解析的JSON數據包
 5 char text[] = "{\"timestamp\":\"2013-11-19T08:50:11\",\"value\":1}";
 6 int main (int argc, const char * argv[])
 7 {
 8     cJSON *json , *json_value , *json_timestamp;
 9     // 解析數據包
10     json = cJSON_Parse(text);
11     if (!json)
12     {
13         printf("Error before: [%s]\n",cJSON_GetErrorPtr());
14     }
15     else
16     {
17         // 解析開關值
18         json_value = cJSON_GetObjectItem( json , "value");
19         if( json_value->type == cJSON_Number )
20         {
21             // 從valueint中得到結果
22             printf("value:%d\r\n",json_value->valueint);
23         }
24         // 解析時間戳
25         json_timestamp = cJSON_GetObjectItem( json , "timestamp");
26         if( json_timestamp->type == cJSON_String )
27         {
28             // valuestring中得到結果
29             printf("%s\r\n",json_timestamp->valuestring);
30         }
31         // 釋放內存空間
32         cJSON_Delete(json);
33     }
34     return 0;
35 }

 

運行結果

value:1
2013-11-19T08:50:11
 

若干說明

1.cJSON_Parse函數負責解析JSON數據包,並按照cJSON結構體的結構序列化整個數據包。使用該函數會經過malloc函數在內存中開闢一個空間,使用完成須要手動釋放。
2.cJSON_GetObjectItem函數可從cJSON結構體中查找某個子節點名稱(鍵名稱),若是查找成功可把該子節點序列化到cJSON結構體中。
3.若是須要使用cJSON結構體中的內容,可經過cJSON結構體中的valueint和valuestring取出有價值的內容(即鍵的值)
4.可經過cJSON_Delete釋放內存空間。
 

4.組裝JSON數據包

組裝數據包的過程和解析數據包的過程相反,下面的例子描述如何組裝如下數據包,該數據包只有一個數據項(鍵值對)。 該例子主要用於模擬向yeelink平臺上傳傳感器數據。
{
 "value": 123.400000
}
 

參考代碼

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"
int main (int argc, const char * argv[])
{
    // 建立JSON Object
    cJSON *root = cJSON_CreateObject();
    // 加入節點(鍵值對),節點名稱爲value,節點值爲123.4
    cJSON_AddNumberToObject(root,"value",123.4);
    // 打印JSON數據包
    char *out = cJSON_Print(root);
    printf("%s\n",out);
    // 釋放內存
    cJSON_Delete(root);
    free(out);
    return 0;
}

  

 

若干說明

1. cJSON_CreateObject函數可建立一個根數據項,以後即可向該根數據項中添加string或int等內容
2. cJSON_AddNumberToObject向節點中添加子節點,例如此處添加value節點,節點值爲123.4
3. cJSON_Print函數能夠打印根數據項,加入製表符換行符等標識符使得JSON數據包更易閱讀
4. 使用free函數釋放被out佔用的內存空間
 

5.總結

總體來講cJSON簡單易用,解決了JSON數據包解析和組裝的問題,向着心中的目標更近一步了。
 

6.參考資料

 

版權聲明:本文爲博主轉載文章,原文地址,只爲方便學習,謝謝博主。html

相關文章
相關標籤/搜索