JSON(JavaScript Object Notation)是一種輕量級(jí)數(shù)據(jù)交換格式。它易于閱讀和編寫(xiě),并且易于機(jī)器解析和生成,符合現(xiàn)代Web服務(wù)通信的需求。C語(yǔ)言是一種強(qiáng)大的編程語(yǔ)言,許多應(yīng)用程序都使用C語(yǔ)言進(jìn)行開(kāi)發(fā),因此C語(yǔ)言中Json解析的實(shí)現(xiàn)也與日俱增。
C語(yǔ)言中常用的Json解析庫(kù)有以下幾個(gè): cJSON、Jansson和json-c。其中,cJSON是C語(yǔ)言中最易于使用的Json庫(kù)之一,可以在嵌入式平臺(tái)上使用,并且僅需一個(gè)c文件和頭文件即可,無(wú)需其他依賴(lài)。
// cJSON的使用示例 cJSON* root = cJSON_Parse(jsonstr); if (root == NULL) { printf("Error before: %s\n", cJSON_GetErrorPtr()); } else { cJSON* name = cJSON_GetObjectItem(root, "name"); cJSON* age = cJSON_GetObjectItem(root, "age"); cJSON* list = cJSON_GetObjectItem(root, "list"); if (name && name->type == cJSON_String) { printf("Name: %s\n", name->valuestring); } if (age && age->type == cJSON_Number) { printf("Age: %d\n", age->valueint); } if (list && list->type == cJSON_Array) { for (int i = 0; i< cJSON_GetArraySize(list); i++) { cJSON* item = cJSON_GetArrayItem(list, i); if (item && item->type == cJSON_String) { printf("Item %d: %s\n", i, item->valuestring); } } } cJSON_Delete(root); }
使用cJSON解析Json,首先需要調(diào)用cJSON_Parse()函數(shù)將Json字符串解析為cJSON數(shù)據(jù)結(jié)構(gòu),然后就可以使用cJSON_GetObjectItem()函數(shù)獲取Json對(duì)象中的屬性。在獲取對(duì)象屬性時(shí),需要判斷該屬性的類(lèi)型是否與預(yù)期一致,例如字符串類(lèi)型就需要使用cJSON_String、整數(shù)類(lèi)型使用cJSON_Number等等。如果獲取的對(duì)象屬性是一個(gè)數(shù)組,可以通過(guò)cJSON_GetArraySize()函數(shù)獲取數(shù)組的長(zhǎng)度,使用cJSON_GetArrayItem()函數(shù)獲取數(shù)組中的元素。
除了cJSON之外,Jansson和json-c也是C語(yǔ)言中常用的Json庫(kù),它們的使用方式與cJSON相似,都是通過(guò)解析Json字符串轉(zhuǎn)換為數(shù)據(jù)結(jié)構(gòu),然后獲取對(duì)象屬性,但是這兩個(gè)庫(kù)需要更多的依賴(lài)庫(kù),使用起來(lái)需要更復(fù)雜的配置。