一、使用說明
cJSON,目前來說,就只有兩個文件,一個cJSON.c 一個cJSON.h文件。工程裏添加這兩個文件就可以使用CJson構造或者解析相應的文件。
二、常用函數介紹
cJSON * cJSON_CreateObject();
創建一個json對象,返回一個cJSON結構體類型的指針。
cJSON *cJSON_CreateArray();
創建一個數組對象,返回一個cJSON結構體類型的指針。
cJSON *cJSON_CreateString(const char *string);
創建一個字符串對象,傳入一個char *類型的字符串,返回一個cJSON結構體類型的指針。
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
向數組對象中添加一個元素,傳入參數array爲cJSON *結構體類型的指針,爲數組對象; item爲添加入數字對象中的對象指針。
void cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);
向json對象中添加一對元素,object爲json對象,string爲加入一對元素中的name,item爲加入一對元素中的value。
cJSON *cJSON_Parse(const char *value);
解析一個json串,傳入一個json格式的字符串,返回一個cJSON *類型的結構體指針。
char *cJSON_Print(cJSON *item);
將一個cJSON結構體代表的json對象轉換爲一個json格式的字符串。
void cJSON_Delete(cJSON *c);
釋放一個cJSON對象所佔用的內存空間。
三、使用CJon構造一個Json格式的字符串
構造一個JSON格式的字符串如下所示:
{
"MsgType":1,
"DeviceID":"s123",
"RegNum":6,
"data":
[
{ "Reg": "vcc", "Val": 12},
{ "Reg": "temp", "Val ": 25},
{ "Reg": "hump", "Val ": 40},
{ "Reg": "voice", "Val ": 60},
{ "Reg": "lvdt", "Val ": 80},
{ "Reg": "door", "Val ": 1}
]
}
Json寫入:
1. 創建json root對象分配空間
2. 向root對象中添加 item item可以是item 、object 、array
1、item:用cJSON_CreateString() cJSON_CreateNumber()創建的item
2、object:先創建json對象分配空間 可以向當前對象中添加item
3、array:先創建array 分配空間 然後向當前的array添加object
3.生成json root對象 的json字符串
4.釋放json root空間。
代碼如下所示:
unsigned RegVal[]={12,25,40,60,80,1};
/****************************構造一個json格式字符串******************************************/
void create_JsonStr(void)
{
cJSON *json;
cJSON *Arrayobj;
cJSON *Array;
char *JsonStr;
char *pcStr;
int i=0;
json = cJSON_CreateObject(); //創建一個cjson對象,返回一個cJSON結構體類型的指針。
cJSON_AddItemToObject(json,"MsgType",cJSON_CreateNumber(1));
cJSON_AddItemToObject(json,"DeviceID",cJSON_CreateString("s123"));
cJSON_AddItemToObject(json,"RegNum",cJSON_CreateNumber(6));
cJSON_AddItemToObject(json,"data", Array = cJSON_CreateArray()); //創建一個Array數組對象 並向cjson對象中添加這個數組對象
for(i=0; i <6; i++)
{
cJSON_AddItemToArray(Array,Arrayobj=cJSON_CreateObject()); //創建一個Arrayobj對象,並將此對象添加到Array數組對象中
pcStr=RegTypeString[i];
cJSON_AddItemToObject(Arrayobj, "Reg", cJSON_CreateString(pcStr) ); //向Arrayobj對象中添加元素
cJSON_AddItemToObject(Arrayobj, "Val", cJSON_CreateNumber(RegVal[i]) ); //向Arrayobj對象中添加元素
}
JsonStr = cJSON_PrintUnformatted(json); //獲取字符串指針 無格式
//JsonStr = cJSON_Print(cjson); //獲取字符串指針 有格式
printf("%s",JsonStr);
cJSON_Delete(json); //刪除主節點對象
free(JsonStr);
}
四、使用CJon解析一個Json格式的字符串
/****************************解析json格式字符串******************************************/
void parse_JsonStr(char *JsonStr)
{
cJSON *json;
cJSON *item;
cJSON *Arrayobj;
cJSON *Array;
char *pcStr;
int i=0;
cJSON *json = cJSON_Parse(jsonStr);
if(NULL == json)
{
printf("parse Err!");
return;
}
item=cJSON_GetObjectItem(json, "MsgType");
printf("MsgType=%d \n",item->valueint);
item=cJSON_GetObjectItem(json, "DeviceID");
printf("DeviceID=%s \n",item->valuestring);
item=cJSON_GetObjectItem(json, "RegNum");
printf("RegNum=%d \n",item->valueint);
Array = cJSON_GetObjectItem(json, "data");
icount=cJSON_GetArraySize(Array);
if(icount != item->valueint)
{
printf("Arry Buff err! \n");
}
for(i=0; i < icount; i++)
{
Arrayobj = cJSON_GetArrayItem(Array, i);
item=cJSON_GetObjectItem(RegTypeArray, "Reg");
printf("Reg=%s ",item->valuestring);
item=cJSON_GetObjectItem(RegTypeArray, "Val");
printf("Reg=%s \n",item->valueint);
}
cJSON_Delete(cjson); //刪除主節點對象
}
五、注意事項
1、cJSON_Print也是分配內存的,需要手動去釋放掉,需要和free()配套使用。
2、 cJSON_PrintUnformatted(json); 和 cJSON_Print(cjson); 都是獲取字符串指針 一種是無格式,一種是有格式。有格式生成的人字符串添加了很多空格盒換行符有利於閱讀,但不利於數據傳輸。推薦使用無格式傳輸。
3、對於一個CJSOn數據樹,只需要刪除主節點,子節點就會主動釋放。但是如果子節點沒有包含在主節點內,需要主動釋放,要不然會造成內存泄漏。使用cJSON_Delete(); //刪除節點對象