cJSON庫描述
CJSON是一個用於解析JSON包的C語言庫,庫文件為cJSON.c和cJSON.h,
所有的實現都在這兩個文件中。原作者的地址cJSON。
JSON包的解析
例如有一個JSON的數據包如下:
{
"rxpk": [
{
"tmst": 1868500100,
"time": "2016-07-07T13:20:40.003906Z",
"chan": 1,
"rfch": 0,
"freq": 779.7,
"stat": 1,
"modu": "LORA",
"datr": "SF9BW125",
"codr": "4/5",
"lsnr": 9.8,
"rssi": -37,
"size": 83,
"data": "QH/4iimAKgACB0KHP8e0IgQAhI0bBi9bvFfb8jHeSWEAhpnsCGHwt9pUCvrRMazQRBtN+kh3Ge5hFL8jUtHpk3luFtcTLlgGVMPSBLpSp8h6C44="
}
]
}
我們需要獲取其中的data字段,需要進行的過程如下:
- 首先聲明變量
cJSON *json;
cJSON *rxpk;
cJSON *arr0;
cJSON *data;
- 將上述的字符串進行解析,並保存在json中;
- 獲取json其中的rxpk字段的內容,並保存在rxpk中;
- 獲取rxpk中的arr部分,拿出一種的第一個數組,並保存在arr0;
- 獲取arr0的data部分,並保存在data;
- 使用data->valuestring即可獲取其中的data字段的內容
具體的代碼實現如下所示:
uint16_t rxpk_data_get(char* text,char* dest_str)
{
uint16_t len = 0;
cJSON *json;
cJSON *data;
cJSON *arr0;
cJSON *rxpk;
json= cJSON_Parse(text);
if(!json)//對JSON包進行合法性檢查
return 0;
rxpk = cJSON_GetObjectItem(json,"rxpk");
if(!rxpk)//對rxpk進行合法性檢查
return 0;
arr0 = cJSON_GetArrayItem(rxpk,0);
if(!arr0)//對arr0進行合法性檢查
return 0;
data =cJSON_GetObjectItem(arr0,"data");
if(!data)//對data進行合法性檢查
return 0;
len = strlen(data->valuestring);
memcpy(dest_str,data->valuestring,len);
dest_str[len] = 0;
return len;
}
在json包中遇到數組時
/* Returns the number of items in an array (or object). */
extern int cJSON_GetArraySize(cJSON *array);
這個函數可以獲取數組的長度。