C List是一種常用的數據結構,它可以將一組數據組織成鏈表的形式。在實際開發中,我們通常需要將C List轉換成JSON字符串數組來傳輸、存儲或打印輸出。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <jansson.h> #include <sys/queue.h> struct data_s { int id; char name[32]; }; LIST_HEAD(list_s, data_s) g_list; int main(int argc, char **argv) { LIST_INIT(&g_list); struct data_s *pdata = (struct data_s *)calloc(1, sizeof(struct data_s)); pdata->id = 1; strncpy(pdata->name, "Tom", sizeof(pdata->name)); LIST_INSERT_HEAD(&g_list, pdata, entries); pdata = (struct data_s *)calloc(1, sizeof(struct data_s)); pdata->id = 2; strncpy(pdata->name, "Jerry", sizeof(pdata->name)); LIST_INSERT_HEAD(&g_list, pdata, entries); json_t *jarray = json_array(); struct data_s *pdata_tmp = NULL; LIST_FOREACH(pdata_tmp, &g_list, entries) { json_t *jobj = json_object(); json_object_set_new(jobj, "id", json_integer(pdata_tmp->id)); json_object_set_new(jobj, "name", json_string(pdata_tmp->name)); json_array_append(jarray, jobj); } char *json_str = json_dumps(jarray, JSON_INDENT(4)); printf("%s\n", json_str); json_decref(jarray); free(json_str); pdata_tmp = NULL; LIST_FOREACH(pdata_tmp, &g_list, entries) { LIST_REMOVE(pdata_tmp, entries); free(pdata_tmp); } LIST_INIT(&g_list); return 0; }
代碼中,我們首先初始化一個C List,然后插入兩個數據節點,并將C List轉換成JSON字符串數組。我們利用jansson庫提供的API,先創建JSON數組對象jarray,然后遍歷C List,將每個數據節點轉換成JSON對象jobj,并將jobj添加到jarray中。最后調用json_dumps將jarray轉成字符串數組json_str,并打印輸出。
最后,我們需要釋放JSON數組對象和C List節點所占用的內存。需要注意的是,因為我們在遍歷C List時使用了LIST_FOREACH宏,所以在釋放節點的時候也需要使用LIST_REMOVE宏。