欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

c json 轉(zhuǎn) listmap

吉茹定2年前9瀏覽0評論

在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)存。