cJSON:解析JSON

eiSouthBoy發表於2024-07-03

解析陣列

將JSON陣列解析並儲存到自定義的結構體組合的單連結串列中,列印單連結串列中所有的結點資料。

例如:

[
  {
    "name": "Zhao",
    "age": 18
  },
  {
    "name": "Qian",
    "age": 19
  },
  {
    "name": "Sun",
    "age": 20
  }
]

需要用一個結構體儲存 nameage 的值,單連結串列儲存多個結構體內容。

#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;
}


結果:

相關文章