1. 程式人生 > >cJSON庫的簡單介紹及使用

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)

    判斷是否有keystring的項 如果有返回否則返回0 :

extern int cJSON_HasObjectItem(cJSON *object,const char *string)
                      { return cJSON_GetObjectItem(object,string)?1:0; }

    返回陣列結點array中成員的個數 :extern int cJSON_GetArraySize(cJSON *array);

    根據陣列下標indexarray陣列結點的第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