cJSON學習及簡單應用小結

Rice_rice發表於2024-06-11

JSON 簡介

JSON(JavaScript Object Notation,JavaScript物件表示法)是一種輕量級的資料交換格式。它基於ECMAScript(歐洲計算機制造商協會制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得JSON成為理想的資料交換語言。

以下是JSON的一些基本特點和用法:

  1. 資料格式:JSON可以表示兩種型別的資料結構:
    • 物件:一個無序的“‘名稱/值’對”集合。一個物件以花括號“{}”括起來,每個“名稱”後跟一個冒號“:”,“‘名稱/值’ 對”之間使用逗號“,”分隔。
    • 陣列:是值(value)的有序集合。一個陣列以方括號“[]”包括起來,值的列表用逗號“,”分隔。
  2. 易於閱讀和編寫:JSON的格式是基於文字的,因此它很容易閱讀和編寫。同時,它也很易於機器解析和生成。
  3. 易於解析:JSON使用JavaScript的一個子集,這意味著在JavaScript環境中,你可以直接解析JSON資料,無需任何額外的解析庫。
  4. 輕量級:JSON的語法非常簡單,資料描述也很緊湊,因此它是輕量級的,適合在網路中傳輸。
  5. 語言無關:雖然JSON基於JavaScript的一個子集,但它可以被任何程式語言讀取和寫入。這使得JSON成為一種理想的資料交換語言,可以用於伺服器與瀏覽器之間,或者不同系統之間的資料交換。

cJSON(C語言JSON)庫介紹

cJSON(C語言JSON)庫是一個用於在C語言中解析和生成JSON資料的輕量級開源庫,主要包括兩個主要的原始檔:cJSON.h(標頭檔案)和cJSON.c(實現檔案),使得在專案中整合和使用非常便捷。

  1. 主要特點

    • 輕量級:cJSON的實現非常簡潔,但功能齊全,適合在嵌入式系統或資源受限的環境中使用。
    • 易於使用:透過簡單的API呼叫,可以輕鬆地將JSON資料解析為C語言的資料結構(如陣列、物件等),或將C語言的資料結構轉換為JSON格式的字串。
    • 跨平臺性:由於cJSON是純C語言實現的,因此它具有良好的跨平臺性,可以在多種作業系統和編譯器上執行。
  2. 資料結構

    cJSON庫的核心部分體現在他的資料結構上,是cJSON結構體,利用該結構體用於表示JSON物件、陣列、鍵值對等元素。

    typedef struct cJSON
    {
        /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem 用於在相同層級的物件或元素之間形成雙向連結串列。*/
        struct cJSON *next;
        struct cJSON *prev;
        /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. 指向下一層級的子節點(如物件中的屬性或陣列中的元素)*/
        struct cJSON *child;
    
        /* The type of the item, as above.表示該元素的資料型別(如物件、陣列、字串、整數等)*/
        int type;
    
        /* The item's string, if type==cJSON_String  and type == cJSON_Raw 用於儲存該元素的具體值(根據`type`的不同而選擇不同的成員來儲存)*/
        char *valuestring;
        /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
        int valueint;
        /* The item's number, if type==cJSON_Number */
        double valuedouble;
    
        /* The item's name string, if this item is the child of, or is in the list of subitems of an object. 用於表示該鍵值對的名稱*/
        char *string;
    } cJSON;
    
  3. 主要功能

    • 解析JSON資料:cJSON庫可以將JSON格式的字串解析為C語言的資料結構,方便後續的處理和操作。
    • 生成JSON資料:透過cJSON庫,可以將C語言的資料結構轉換為JSON格式的字串,以便於傳輸、儲存或與其他系統進行資料互動。

cJSON安裝

cJSON專案託管在Github上,倉庫地址,因此可以用git命令直接克隆到本地,命令如下

git clone https://github.com/DaveGamble/cJSON.git

直接到cJSON託管的github官網進行下載,然後複製到自己的專案資料夾下面,官網如下:

https://github.com/DaveGamble/cJSON

官網的README還推薦了別的安裝方法,CMAKE,Vcpkg等。

解析JSON資料常用API及簡單舉例

CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
//提供一段JSON格式內容,這將返回一個您可以查詢的cJSON物件。
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
//從Object中獲取專案“string”。不區分大小寫。
CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
//從Object中獲取專案“string”。區分大小寫。

cJSON_ArrayForEach(element, array);
//帶引數宏定義,遍歷陣列array中的element元素

CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);//將cJSON列印

應用舉例:

//recvbuf={"results":[{"location":{"id":"WS0E9D8WN298","name":"廣州","country":"CN","path":"廣州,廣州,廣東,中國","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"陰","code":"9","temperature":"27"},"last_update":"2024-06-11T19:38:38+08:00"}]}
...
    cJSON *wea = cJSON_Parse(recvbuf); // 1.解析
    printf("%s\n", cJSON_Print(wea));  // 列印預覽

    cJSON *results = cJSON_GetObjectItem(wea, "results"); // 2.開啟遇到的第一個物件

    cJSON *result = NULL;
    cJSON_ArrayForEach(result, results) // 3.遍歷"results"陣列
    {
        cJSON *now = cJSON_GetObjectItem(result, "now");              // 將遇到的result物件中,如果存在“now”的元素就記錄
        cJSON *temperature = cJSON_GetObjectItem(now, "temperature"); // 將遇到的now物件中,如果存在“temperature”的元素就記錄
        printf("temperature :%d\n", atoi(temperature->valuestring));  // printf("temperature :%s\n", temperature->valuestring);
    }
...

輸出結果

{
        "results":      [{
                        "location":     {
                                "id":   "WS0E9D8WN298",
                                "name": "廣州",
                                "country":      "CN",
                                "path": "廣州,廣州,廣東,中國",
                                "timezone":     "Asia/Shanghai",
                                "timezone_offset":      "+08:00"
                        },
                        "now":  {
                                "text": "陰",
                                "code": "9",
                                "temperature":  "27"
                        },
                        "last_update":  "2024-06-11T19:38:38+08:00"
                }]
}
temperature :27

生成JSON資料API及簡單舉例

(和下次的base64編碼一起更新)

相關文章