cJSON庫的簡單介紹及使用
轉載:http://www.cnblogs.com/liunianshiwei/p/6087596.html
JSON 語法是 JavaScript 物件表示法語法的子集。資料在鍵/值對中;資料由逗號分隔;花括號儲存物件, 也稱一個文件物件;方括號儲存陣列, 每個陣列成員用逗號隔開, 並且每個陣列成員可以是文件物件或者陣列或者鍵值對 。
JSON基於兩種結構:
“名稱/值”對的集合(A collection of name/value pairs)。不同的程式語言中,它被理解為物件(object),紀錄(record),結構(struct),字(dictionary),雜湊表(hashtable),有鍵列表(keyed list),或者關聯陣列 (associative array)。
值的有序列表(An ordered list of values)。在大部分語言中,它被實現為陣列(array),向量(vector),列表(list),序列(sequence)。
JSON的三種語法:
鍵/值對 key:value,用半形冒號分割。 比如 "name":"Faye"
文件物件 JSON物件寫在花括號中,可以包含多個鍵/值對。比如{ "name":"Faye" ,"address":"北京" }。
陣列 JSON 陣列在方括號中書寫: 陣列成員可以是物件,值,也可以是陣列(只要有意義)。 {"love": ["乒乓球","高爾夫","斯諾克","羽毛球","LOL","撩妹"]}
附cJSON庫下載地址 https://github.com/DaveGamble/cJSON
如何在自己的專案中使用cJSON庫:
將cJSON.c(或者庫檔案) 和 cJSON.h新增到專案中即可;
C語言函式庫寫JSON檔案 :
從緩衝區中解析出JSON結構:extern cJSON *cJSON_Parse(const char *value);
解析一塊JSON資料返回cJSON結構, 在使用完之後呼叫cJSON_Delete函式釋放json物件結構。
將傳入的JSON結構轉化為字串 :extern char *cJSON_Print(cJSON *item);
可用於輸出到輸出裝置, 使用完之後free(char *) 。
將JSON結構所佔用的資料空間釋放 :void cJSON_Delete(cJSON *c)
建立一個值型別的資料 :extern cJSON *cJSON_CreateNumber(double num);
extern cJSON *cJSON_CreateString(const char *string);
extern cJSON *cJSON_CreateArray(void);
建立一個物件(文件) :extern cJSON *cJSON_CreateObject(void);
陣列建立以及新增 :cJSON *cJSON_CreateIntArray(const int *numbers,int count);
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
JSON巢狀 :
【 向物件中增加鍵值對】 cJSON_AddItemToObject(root, "rows", 值型別資料相關函式());
【 向物件中增加陣列】 cJSON_AddItemToObject(root, "rows", cJSON_CreateArray());
【 向陣列中增加物件】 cJSON_AddItemToArray(rows, cJSON_CreateObject());
幾個能提高操作效率的巨集函式 :#define cJSON_AddNumberToObject(object,name,n) \
cJSON_AddItemToObject(object, name,cJSON_CreateNumber(n))
#define cJSON_AddStringToObject(object,name,s)\
cJSON_AddItemToObject(object, name, cJSON_CreateString(s))
C語言庫函式解析JSON檔案 :
根據鍵找json結點 :extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string)
判斷是否有key是string的項 如果有返回1 否則返回0 :
extern int cJSON_HasObjectItem(cJSON *object,const char *string)
{ return cJSON_GetObjectItem(object,string)?1:0; }
返回陣列結點array中成員的個數 :extern int cJSON_GetArraySize(cJSON *array);
根據陣列下標index取array陣列結點的第index個成員 返回該成員節點 :extern cJSON *cJSON_GetArrayItem(cJSON *array,int index);
遍歷陣列 :#define cJSON_ArrayForEach(pos, head) for(pos = (head)->child; pos != NULL; pos = pos->next)
例子:
1.解析json
void CParsejson() { char* data = "{\"name\":\"Messi\",\"age\":\"29\"}";
//從緩衝區中解析json結構 cJSON* root = cJSON_Parse(data); if (data == NULL) { return; } cJSON* itemName = cJSON_GetObjectItem(root, "name"); if (itemName) { cout << "name: "<< itemName->valuestring << endl; } cJSON* itemAge = cJSON_GetObjectItem(root, "age"); if (itemAge) { cout << "age: " << itemAge->valuestring << endl; } //講json結構佔用的資料空間釋放 cJSON_Delete(root); } int main() { CjsonTest1(); return 0; }
執行結果:
2.講json資料寫入檔案
void WriteJson() { char *char_json = "{\"hello\":\"你好\"}"; //從緩衝區中解析出JSON結構 cJSON *json = cJSON_Parse(char_json); if (json == NULL) { return; } //將傳入的JSON結構轉化為字串 char *buf = NULL; buf = cJSON_Print(json); //開啟一個info.json檔案,並寫入json內容 FILE *fp = fopen("info.json", "w"); fwrite(buf, strlen(buf), 1, fp); fclose(fp);//關閉檔案 free(buf);//釋放資源 cJSON_Delete(json);//釋放資源 } int main() { WriteJson(); return 0; }
檔案內容:
3.程式碼生成json