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結構體以下所示:
- typedef struct cJSON {
- struct cJSON *next,*prev;
- struct cJSON *child;
- int type;
- char *valuestring;
- int valueint;
- double valuedouble;
- char *string;
- } 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平臺請求開關量數據。
參考代碼
運行結果
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