解析陣列
將JSON陣列解析並儲存到自定義的結構體組合的單連結串列中,列印單連結串列中所有的結點資料。
例如:
[
{
"name": "Zhao",
"age": 18
},
{
"name": "Qian",
"age": 19
},
{
"name": "Sun",
"age": 20
}
]
需要用一個結構體儲存 name
和 age
的值,單連結串列儲存多個結構體內容。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
// 結點資料部分宣告
typedef struct node_data_t
{
char name[20];
int age;
}node_data_t;
// 結點和連結串列宣告
typedef struct node_t
{
node_data_t data;
struct node_t *next;
} node_t, *link_list_t;
// 連結串列初始化,malloc一個頭節點
int list_init(link_list_t *L)
{
*L = (node_t *)malloc(sizeof(node_t));
if (NULL == (*L))
return 1;
memset(*L, 0, sizeof(node_t));
(*L)->next = NULL;
return 0;
}
// 連結串列釋放,釋放全部結點內容,包括頭結點在內
int list_free(link_list_t *L)
{
node_t *tmp = NULL;
while (*L)
{
tmp = *L;
*L = (*L)->next;
free(tmp);
}
return 0;
}
// 連結串列尾部插入一個結點
int list_insert(link_list_t L, node_data_t data)
{
node_t *last = L;
if (L == NULL)
return 1;
// 尾插法
while (last->next != NULL)
last = last->next;
node_t *curr = (node_t *)malloc(sizeof(node_t));
if (NULL == curr)
return 2;
memset(curr, 0, sizeof(node_t));
curr->data = data;
curr->next = NULL;
last->next = curr;
return 0;
}
// 列印連結串列的結點資料
int list_print(link_list_t L)
{
node_t *curr = NULL;
printf("name age \n");
printf("====================\n");
for (curr = L->next; curr != NULL; curr = curr->next)
{
printf("%-10s%-10d\n", curr->data.name, curr->data.age);
}
return 0;
}
// 解析JSON 陣列,將資料儲存到連結串列
int json_array_string_parse(link_list_t L, const char *json_str)
{
// 解析 JSON 字串
cJSON *root = cJSON_Parse(json_str);
if (root == NULL)
{
fprintf(stderr, "Error parsing JSON\n");
return 1;
}
// 遍歷 JSON 陣列
cJSON *item = root->child; //將item指向第一個object,即 {}
while (item != NULL)
{
// 獲取 name 和 age 的值
cJSON *iname = NULL;
cJSON *iage = NULL;
iname = cJSON_GetObjectItem(item, "name");
iage = cJSON_GetObjectItem(item, "age");
// 插入新節點到連結串列
node_data_t data;
memset(&data, 0, sizeof(node_data_t));
strcpy(data.name, iname->valuestring);
data.age = iage->valueint;
list_insert(L, data);
// 移動到下一個元素
item = item->next;
}
return 0;
}
int main()
{
link_list_t list;
list_init(&list);
const char *jsonString = "[{\"name\": \"Zhao\", \"age\": 18 }, "
"{\"name\": \"Qian\", \"age\": 19}, "
"{\"name\": \"Sun\", \"age\": 20}]";
json_array_string_parse(list, jsonString);
list_print(list);
list_free(&list);
return 0;
}
結果: