JSON 簡介
JSON(JavaScript Object Notation,JavaScript物件表示法)是一種輕量級的資料交換格式。它基於ECMAScript(歐洲計算機制造商協會制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得JSON成為理想的資料交換語言。
以下是JSON的一些基本特點和用法:
- 資料格式:JSON可以表示兩種型別的資料結構:
- 物件:一個無序的“‘名稱/值’對”集合。一個物件以花括號“{}”括起來,每個“名稱”後跟一個冒號“:”,“‘名稱/值’ 對”之間使用逗號“,”分隔。
- 陣列:是值(value)的有序集合。一個陣列以方括號“[]”包括起來,值的列表用逗號“,”分隔。
- 易於閱讀和編寫:JSON的格式是基於文字的,因此它很容易閱讀和編寫。同時,它也很易於機器解析和生成。
- 易於解析:JSON使用JavaScript的一個子集,這意味著在JavaScript環境中,你可以直接解析JSON資料,無需任何額外的解析庫。
- 輕量級:JSON的語法非常簡單,資料描述也很緊湊,因此它是輕量級的,適合在網路中傳輸。
- 語言無關:雖然JSON基於JavaScript的一個子集,但它可以被任何程式語言讀取和寫入。這使得JSON成為一種理想的資料交換語言,可以用於伺服器與瀏覽器之間,或者不同系統之間的資料交換。
cJSON(C語言JSON)庫介紹
cJSON(C語言JSON)庫是一個用於在C語言中解析和生成JSON資料的輕量級開源庫,主要包括兩個主要的原始檔:cJSON.h(標頭檔案)和cJSON.c(實現檔案),使得在專案中整合和使用非常便捷。
-
主要特點
- 輕量級:cJSON的實現非常簡潔,但功能齊全,適合在嵌入式系統或資源受限的環境中使用。
- 易於使用:透過簡單的API呼叫,可以輕鬆地將JSON資料解析為C語言的資料結構(如陣列、物件等),或將C語言的資料結構轉換為JSON格式的字串。
- 跨平臺性:由於cJSON是純C語言實現的,因此它具有良好的跨平臺性,可以在多種作業系統和編譯器上執行。
-
資料結構
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;
-
主要功能
- 解析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編碼一起更新)