在C語言中,我們經(jīng)常會遇到將JSON數(shù)據(jù)轉(zhuǎn)化為ListMap的場景。ListMap的實(shí)現(xiàn)是通過將JSON數(shù)據(jù)轉(zhuǎn)化為一個動態(tài)數(shù)組,而數(shù)組中的每個元素又是一個Map類型的鍵值對。
// 定義Map結(jié)構(gòu)體 struct Map { char *key; // map的鍵 void *value; // map的值 }; // 定義ListMap結(jié)構(gòu)體 struct ListMap { struct Map *map; // 存儲Map類型數(shù)據(jù)的數(shù)組 int size; // 數(shù)組長度 };
我們可以使用 cJSON 這個開源庫來解析JSON數(shù)據(jù)。cJSON支持將JSON數(shù)據(jù)轉(zhuǎn)化為數(shù)組、Map、字符串、數(shù)字等基本類型。
#include "cJSON.h" // 將JSON數(shù)據(jù)轉(zhuǎn)化為一個ListMap類型的結(jié)構(gòu)體 struct ListMap *jsonToListMap(char *json) { struct ListMap *listMap = malloc(sizeof(struct ListMap)); cJSON *root = cJSON_Parse(json); if (!root) { printf("Invalid JSON data.\n"); return NULL; } // 獲取JSON數(shù)據(jù)中的數(shù)組 cJSON *arrayJson = cJSON_GetObjectItem(root, "list"); if (arrayJson == NULL || cJSON_IsArray(arrayJson) == false) { printf("Invalid JSON data.\n"); return NULL; } // 計(jì)算數(shù)組長度 int arraySize = cJSON_GetArraySize(arrayJson); // 遍歷數(shù)組,將每個元素轉(zhuǎn)化為一個Map類型的鍵值對 struct Map *mapArray = malloc(sizeof(struct Map) * arraySize); for (int i = 0; i< arraySize; i++) { cJSON *itemJson = cJSON_GetArrayItem(arrayJson, i); // 解析Map中的鍵 cJSON *keyJson = cJSON_GetObjectItem(itemJson, "key"); char *key = keyJson ? keyJson->valuestring : ""; mapArray[i].key = key; // 解析Map中的值 cJSON *valueJson = cJSON_GetObjectItem(itemJson, "value"); void *value = NULL; if (valueJson == NULL || cJSON_IsNumber(valueJson) == false) { value = valueJson->valuestring; // Map的值為字符串類型 } else { value = malloc(sizeof(int)); // Map的值為數(shù)字類型 *((int *) value) = valueJson->valueint; } mapArray[i].value = value; } listMap->map = mapArray; listMap->size = arraySize; cJSON_Delete(root); return listMap; }
在實(shí)際的開發(fā)中,我們需要注意內(nèi)存泄漏的問題。當(dāng)不使用動態(tài)分配內(nèi)存的變量時,一定要記得及時釋放內(nèi)存。