CJson使用(構造和解析)

一、使用說明

    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();                        //刪除節點對象

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章