C語言中,JSON反序列化是指將JSON格式的數據轉換為對應的C語言數據類型。若JSON格式中包含了列表類型,那么在反序列化時就需要將JSON數組轉換為C語言中的數組或鏈表等數據結構。
例如,假設我們有以下JSON格式的數據: { "fruits": [ { "name": "apple", "color": "red" }, { "name": "banana", "color": "yellow" } ] } 我們想要將其中的“fruits”數組轉換為C語言中的鏈表數據結構,代碼如下:
#include <stdio.h> #include <jansson.h> typedef struct _fruit { char *name; char *color; struct _fruit *next; } Fruit; int main() { const char *json_str = "{\"fruits\": [{\"name\": \"apple\", \"color\": \"red\"}," "{\"name\":\"banana\", \"color\":\"yellow\"}]}"; json_error_t error; json_t *root = json_loads(json_str, 0, &error); if (!root) { fprintf(stderr, "error: on line %d: %s\n", error.line, error.text); return 1; } json_t *fruits_arr = json_object_get(root, "fruits"); size_t index; json_t *value; Fruit *head = NULL; Fruit *curr = NULL; json_array_foreach(fruits_arr, index, value) { Fruit *tmp = calloc(1, sizeof(Fruit)); tmp->name = strdup(json_string_value(json_object_get(value, "name"))); tmp->color = strdup(json_string_value(json_object_get(value, "color"))); if (!head) { head = tmp; curr = tmp; } else { curr->next = tmp; curr = curr->next; } } // 遍歷鏈表 curr = head; while (curr) { printf("name: %s\tcolor: %s\n", curr->name, curr->color); curr = curr->next; } // 釋放內存 curr = head; while (curr) { Fruit *tmp = curr->next; free(curr->name); free(curr->color); free(curr); curr = tmp; } json_decref(root); return 0; }
以上代碼使用了jansson庫來實現JSON的反序列化。首先通過“json_loads”函數將JSON字符串轉換為jansson庫中的“json_t”類型對象,然后使用“json_object_get”函數獲取“fruits”數組對象,之后通過“json_array_foreach”遍歷數組中的元素,并將其轉換為“Fruit”結構體類型。
最后,對于鏈表的遍歷和內存釋放,我們也可以使用其他的方式,如遞歸或待釋放元素鏈表等方法。