C語言中的JSON庫cJSON可以方便地將JSON格式的字符串序列化為C語言中的對象,但是當JSON中包含多個相同類型的元素時,將其反序列化為C語言中的list就比較困難。下面我們介紹一種方法,使用cJSON和C語言的指針操作,將JSON反序列化為list。
#include <stdio.h> #include <stdlib.h> #include <cjson/cJSON.h> // 定義存儲元素的結構體 typedef struct _Node { int value; struct _Node *next; } Node; // 定義函數,將JSON反序列化為list Node *deserialize(const char *json) { cJSON *root = cJSON_Parse(json); // 解析JSON字符串 cJSON *array = cJSON_GetObjectItem(root, "array"); // 獲取JSON中的數組 Node *head = NULL, *tail = NULL; int size = cJSON_GetArraySize(array); for(int i=0; i<size; i++) { cJSON *item = cJSON_GetArrayItem(array, i); int value = cJSON_GetNumberValue(item); Node *node = (Node *)malloc(sizeof(Node)); // 創建新的節點 node->value = value; node->next = NULL; if(tail) { // 如果鏈表不為空,則將新節點添加到末尾 tail->next = node; tail = node; } else { // 如果鏈表為空,則創建新鏈表 head = tail = node; } } cJSON_Delete(root); // 釋放JSON對象 return head; } int main() { const char *json = "{ \"array\": [1, 2, 3, 4] }"; Node *head = deserialize(json); Node *p = head; while(p) { // 遍歷鏈表,輸出結果 printf("%d ", p->value); p = p->next; } printf("\n"); return 0; }
在上述代碼中,我們使用cJSON庫中的cJSON_Parse函數將JSON字符串解析為JSON對象,然后使用cJSON_GetObjectItem函數獲取JSON對象中的數組,接著使用cJSON_GetArraySize和cJSON_GetArrayItem函數獲取數組的大小和數組中的元素,并創建新的節點,將元素添加至鏈表中。
值得注意的是,在創建節點時,我們使用了C語言中的malloc函數動態分配內存,確保了節點可以在函數調用結束后仍然存在;在釋放JSON對象時,我們使用了cJSON_Delete函數手動釋放內存,避免了內存泄漏。