JSON 簡介 JSON(JavaScript Object Notation,JavaScript對象表示法)是一種輕量級的數據交換格式。它基於ECMAScript(歐洲電腦製造商協會制定的js規範)的一個子集,採用完全獨立於編程語言的文本格式來存儲和表示數據。簡潔和清晰的層次結構使得JSON成 ...
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編碼一起更新)