首页 > 其他分享 >cJSON:解析JSON

cJSON:解析JSON

时间:2024-07-03 20:31:23浏览次数:1  
标签:node NULL curr name cJSON list JSON 解析 data

解析数组

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


结果:

标签:node,NULL,curr,name,cJSON,list,JSON,解析,data
From: https://www.cnblogs.com/caojun97/p/18281035

相关文章

  • 【JavaScript脚本宇宙】高效Web开发利器:全面解析六大HTML解析器与DOM库
    精益求精:揭秘六个改变Web开发的HTML解析与DOM操作工具前言在现代Web开发中,HTML解析器和DOM操作库是不可或缺的工具。无论是爬取数据、处理复杂的HTML文档,还是模拟浏览器环境,这些工具都扮演着关键角色。本文将深入探讨六个广泛使用的HTML解析器和DOM操作库,它们分别是:htmlpa......
  • 【总线】AXI4第六课时:寻址选项深入解析
      大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣,那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者,AXI4以其高性能和高度可扩展性,成为了现代电子系统中不可或缺的通信桥梁。    上几课时我们了解......
  • 解析Kotlin中扩展函数与扩展属性【笔记摘要】
    1.扩展函数1.1作用域:扩展函数写的位置不同,作用域就也不同扩展函数可以写成顶层函数(Top-levelFunction),此时它只属于它所在的package。这样你就能在任何类里使用它:packagecom.rengwuxianfunString.method1(i:Int){...}..."rengwuxian".method1(1)扩展函数......
  • 24位PCM采样数据和16位相互转换算法实例解析
    一概念1.24bit音频:24bit指使用3个字节记录振幅值,意味可以记录16,777,216种声音振幅的变化,动态范围可达144dB(人耳听觉的动态范围是120dB,超过120dB人耳会痛,所以120dB又称痛阀)。下面是三种常见的音频采样比对表: 2.24位一般是采样深度的概念,还有一......
  • 深入解析 Laravel 事件系统:架构、实现与应用
    Laravel的事件系统是框架中一个强大且灵活的功能,它允许开发者在应用程序中定义和使用自定义事件和监听器。这个系统基于观察者模式,使得代码解耦和可维护性大大提高。在本文中,我们将深入探讨Laravel事件系统的工作原理、如何实现自定义事件和监听器,以及如何在实际项目中应......
  • Java实现生成二维码及二维码解析
    1、导入所需的工具类jar包<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>com.google.zxing</gro......
  • xorshift 论文解析
    论文地址//xorshiftpaper:https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf1.介绍.方法:把一个数跟他自己shift之后的数做异或.重复几次得到的数就是一个随机数.用c语言来说就是y^(y<<a)ory^(y>>a)2.理论:数学上RNG算法可以写作.我们给一个种子集合Z......
  • Vector底层结构和代码解析
    基本介绍定义说明publicclassVector<E>extendsAbstractList<E>implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{Vector底层是一个对象数组,protectedObject[]elementData;Vector是线程同步的(线程安全),Vector类的操作方法带有synchronized......
  • 读取.net core配置文件appsetting.json内容
    appsetting.json内容//省略部分代码...//代码生成相关"CodeCreatorInfo":{"xmlPath":"11111",//xml路径(绝对路径)"jsRootPaht":"2222",//js文件夹路径"Controllers":"333",//特殊Controller列表,逗号隔开......
  • Java 流式编程详解,Demo案例解析
    Java流式编程详解,Demo案例解析JavaStreams在很多年前就被引入了,但作为Java开发者,我们还没有完全掌握这个多功能工具的威力。在这里,你将发现一些有价值的技巧,可以作为参考并应用到你的下一个项目中。在下面的示例中,我们将使用以下类。@GetterclassCompany{privat......