cJSON 处理 JSON(轻量级 C 语言库)(二)

news2025/4/2 22:43:19

第二部分:cJSON 处理 JSON(轻量级 C 语言库)

📢 快速掌握 cJSON!文章 + 视频双管齐下 🚀

如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 cJSON 课程视频!🎬 视频里会用更直观的方式讲解 cJSON 的核心概念、实战技巧,并配有动手演示,让你更高效地掌握 JSON 的处理方法!

当然,如果你喜欢深度阅读,这篇文章会帮助你系统地理解 cJSON,从基础到进阶!无论你选择哪种方式,最终目标都是让你成为 cJSON 处理的高手!💪

🎥 点击这里观看视频 👉 视频链接

一:cJSON 库概述与环境配置

1.1 cJSON 简介(特点、适用场景)
  • cJSON 是一个轻量级开源的 C 语言 JSON 解析库,专门用于处理 JSON 格式数据。它具有以下特点:
    • 简单易用,API 设计清晰,代码可读性强。
    • 轻量级,适用于嵌入式系统、物联网(IoT)等对资源敏感的应用场景。
    • 无需额外依赖,仅需一个 cJSON.ccJSON.h 文件即可使用。
1.2 下载和安装 cJSON

方法 1:直接下载 cJSON 源码

  1. 从 cJSON 官方 GitHub 下载 cJSON.hcJSON.c

    https://github.com/DaveGamble/cJSON

  2. 在项目中包含 cJSON.h:

    #include "cJSON.h"
    
  3. 编译时需链接 cJSON.c:

    gcc main.c cJSON.c -o main
    

方法 2:使用 CMake 进行安装

  1. 克隆 cJSON 源码:

    git clone https://github.com/DaveGamble/cJSON.git
    cd cJSON
    
  2. 使用 CMake 编译:

    mkdir build
    cd build
    cmake ..
    make
    sudo make install 
    # 头文件 /usr/local/include 或 /usr/include
    # 库文件 /usr/local/lib 或 /usr/lib
    # execute /usr/local/bin 或 /usr/bin
    
1.3 在 C 语言项目中集成 cJSON(CMake / 手动编译)

示例代码:CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(cJSONExample)

add_executable(cjson_test main.c cJSON.c)
1.4 cJSON 数据类型

cJSON 提供了多种数据类型来处理不同的 JSON 数据。下面列出所有可用的类型:

类型 描述 示例
cJSON_False 代表 JSON 中的 false false
cJSON_True 代表 JSON 中的 true true
cJSON_NULL 代表 JSON 中的 null null
cJSON_Number 代表 JSON 中的数字 123, -45.67
cJSON_String 代表 JSON 中的字符串 "Hello, world!"
cJSON_Array 代表 JSON 中的数组 [1, 2, 3]
cJSON_Object 代表 JSON 中的对象 {"name": "Alice"}
cJSON_Raw 代表 JSON 中的原始值(不进行转义) "\\u1234"

二:使用 cJSON 解析 JSON

  • 加载 JSON 数据(字符串)
  • 解析 JSON 字符串为 cJSON 对象
  • 访问 JSON 对象的键值对
  • 遍历 JSON 数组

讲解内容

解析 JSON 字符串

  • cJSON_Parse() 将 JSON 字符串转换为 cJSON 结构体对象。
  • 访问 JSON 数据(字符串、数值、布尔值、数组、对象)。
2.1 加载 JSON 字符串
  • cJSON 提供了 cJSON_Parse 来将 JSON 字符串解析为 cJSON 对象。

  • cJSON_Print来输出,将cJSON item/实体/结构渲染为文本

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int main() {
   
    // JSON 字符串
    const char *json_str = "{\"name\":\"Alice\",\"age\":25,\"is_student\":false}";

    // 解析 JSON 字符串
    cJSON *json = cJSON_Parse(json_str);
    if (json == NULL) {
   
        printf("解析失败!\n");
        return -1;
    }

    // 打印解析后的 JSON 对象
    char *printed_json = cJSON_Print(json);
    printf("解析后的 JSON: %s\n", printed_json);

    // 释放内存
    cJSON_Delete(json);
    free(printed_json);

    return 0;
}
2.2 解析 JSON 字符串
  • 通过 cJSON_GetObjectItem 来获取指定键的值,并根据其类型进一步处理。

📌 示例 1:解析一个简单 JSON

{
   
    "name": "张三",
    "age": 28,
    "married": false
}

C 代码解析 JSON

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int main() {
   
    // JSON 字符串
    const char *json_str = "{\"name\": \"张三\", \"age\": 28, \"married\": false}";

    // 解析 JSON
    cJSON *root = cJSON_Parse(json_str);
    if (root == NULL) {
   
        printf("JSON 解析失败!\n");
        return -1;
    }

    // 读取 name 字段
    cJSON *name = cJSON_GetObjectItem(root, "name");
    if (cJSON_IsString(name)) {
   
        printf("姓名: %s\n", name->valuestring);
    }

    // 读取 age 字段
    cJSON *age = cJSON_GetObjectItem(root, "age");
    if (cJSON_IsNumber(age)) {
   
        printf("年龄: %d\n", age->valueint);
    }

    // 读取 married 字段
    cJSON *married = cJSON_GetObjectItem(root, "married");
    if (cJSON_IsBool(married)) {
   
        printf("已婚: %s\n", married->valueint ? "是" : "否");
    }

    // 释放 JSON 内存
    cJSON_Delete(root);
    return 0;
}

输出结果

姓名: 张三
年龄: 28
已婚: 否
2.3 解析 JSON 数组

📌 示例 2:解析数组

{
   
    "fruits": ["苹果", "香蕉", "葡萄"]
}

C 代码解析 JSON 数组

const char *json_str = "{ \"fruits\": [\"苹果\", \"香蕉\", \"葡萄\"] }";
cJSON *root = cJSON_Parse(json_str);
cJSON *fruits = cJSON_GetObjectItem(root, "fruits");

if (cJSON_IsArray(fruits)) {
   
    int array_size = cJSON_GetArraySize(fruits);
    for (int i = 0; i < array_size; i++) {
   
        cJSON *item = cJSON_GetArrayItem(fruits, i);
        printf("水果 %d: %s\n", i + 1, item->valuestring);
    }
}

输出

水果 1: 苹果
水果 2: 香蕉
水果 3: 葡萄
2.4 解析 JSON 文件

📌 示例 4:读取 JSON 文件

  1. 创建 config.json
{
   
    "server": "192.168.1.1",
    "port": 8080,
    "debug": true
}
  1. C 代码解析 JSON 文件
FILE *file = fopen("config.json", "r");
if (!file) {
   
    printf("无法打开文件\n");
    return -1;
}

char buffer[1024];
fread(buffer, 1, sizeof(buffer), file);
fclose(file);

cJSON *root = cJSON_Parse(buffer);
printf("服务器: %s\n", cJSON_GetObjectItem(root, "server")->valuestring);
printf("端口: %d\n", cJSON_GetObjectItem(root, "port")->valueint);
printf("调试模式: %s\n", cJSON_GetObjectItem(root, "debug")->valueint ? "开启" : "关闭");

cJSON_Delete(root);

输出

服务器: 192.168.1.1
端口: 8080
调试模式: 开启

重点知识

cJSON_Parse() 解析 JSON
✅ 访问 JSON 数据的方法(对象和数组)
✅ 释放 cJSON 解析后的内存(cJSON_Delete()

学习目标

  • 能够使用 cJSON 解析 JSON 字符串。
  • 掌握 cJSON 访问 JSON 数据的 API。
  • 了解 JSON 解析后如何正确释放内存。

三:创建、修改、删除 JSON数据

  • 创建 JSON 对象和数组
  • 动态添加/删除键值对
  • 修改 JSON 数据
  • 格式化 JSON 输出

讲解内容

创建 JSON 对象

  • cJSON_CreateObject() 创建 JSON 对象。
  • cJSON

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器数据恢复—误格式化NTFS文件系统分区别慌,NTFS数据复活秘籍

NTFS文件系统下格式化在理论上不会对数据造成太大影响&#xff0c;但有可能造成部分文件目录结构丢失的情况。下面介绍一个人为误操作导致服务器磁盘阵列中的NTFS文件系统分区被格式化后的服务器数据恢复案例。 服务器数据恢复过程&#xff1a; 1、将故障服务器连接到一台备份…

【3】数据结构的双向链表章

目录标题 双向链表的定义双向链表的初始化双向链表的创建插入操作删除操作 双向链表总代码与调试 双向链表的定义 结点结构组成&#xff1a;数据域&#xff08;data&#xff09;、指针域&#xff08;pre&#xff09;、指针域&#xff08;next&#xff09;。其中&#xff0c; da…

蓝桥杯杯赛-日期模拟

知识点 处理日期 1. 按天枚举日期&#xff1a;逐天遍历起始日期到结束日期范围内的每个日期。 2. 处理闰年&#xff1a;正确判断闰年条件。闰年定义为&#xff1a;年份 满足以下任意一个条件&#xff1a;(闰年的2月只有29天) 满足下面一个条件就是闰年 1> 是 400 的倍数…

搭建开源笔记平台:outline

折腾的意义 为什么要自己搭建一个笔记平台&#xff1f;没理由&#xff0c;就是突然想试试。有时候突然有个想法&#xff0c;搜了一下正好有合适的方案&#xff0c;就顺手试一下。 其实已经有很多成熟的笔记软件&#xff0c;例如Notion/OneNote&#xff0c;但谁不想要一个数据完…

Unity编辑器功能及拓展(2) —Gizmos编辑器绘制功能

Unity中的Gizmos功能是用于在场景视图中绘制辅助图形或图标的工具&#xff0c;帮助开发者在编辑模式下直观调试和可视化游戏对象的位置、范围、方向等信息。 一.定义概述 Gizomsd 概述 Gizoms是Unity提供的一个API&#xff0c;或者叫做一个工具类&#xff0c;包含一系列静态…

电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法

调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中&#xff0c;合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一&#xff1a;使用快捷键 大多数笔…

presto行转列

presto的行列转换和spark、hive一样也是通过外链语句实现的&#xff0c;只不过语法和关键子有点不同&#xff0c;如下 with tmp1 as (select 1,2,3 as a1,4,5,6 as a2 ) select * from tmp1 cross join unnest(split(tmp1.a1, ,),split(tmp1.a2, ,) ) as b(a1s,a2s) 结果如下

51c自动驾驶~合集15

我自己的原文哦~ https://blog.51cto.com/whaosoft/11720657 #DRAMA 首个基于Mamba的端到端运动规划器&#xff08;新加坡国立&#xff09; 运动规划是一项具有挑战性的任务&#xff0c;在高度动态和复杂的环境中生成安全可行的轨迹&#xff0c;形成自动驾驶汽车的核心能…

拼多多 anti-token unidbg 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 版本7.3-7.4 都试过加密没什…

【Git】5 个分区的切换方式及示例

目录 1. **工作区&#xff08;Working Directory&#xff09;**2. **缓存区&#xff08;Stage/Index&#xff09;**3. **本地仓库&#xff08;Local Repository&#xff09;**4. **远程仓库&#xff08;Remote Repository&#xff09;**5. **贮藏区&#xff08;Stash&#xff0…

Java高频面试之并发编程-02

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;进程和线程的区别是什么&#xff1f; 1. 资源分配与独立性 进程&#xff1a; 独立性&#xff1a;每个进程拥有独立的内存…

openwebui和keycloak集成,使用keycloak的用户名和密码登录

1&#xff0c;实现效果 使用keycloak定义的用户名和密码&#xff0c;直接登录openwebui 2&#xff0c;实现原理 keycloak中用户信息中包含用户名和密码&#xff0c;以及email。 使用keycloak中的用户名和密码登录之后&#xff0c;会用email创建一个openwebui的账号。之后每次…

【区块链安全 | 第八篇】多签机制及恶意多签

部分参考&#xff1a;慢雾科技 文章目录 为什么需要多签多签机制Tron钱包下的恶意多签Tron 钱包多签权限分类Tron 多签机制的运作方式 恶意多签的过程黑客通过多签机制控制账户黑客剥夺用户权限&#xff0c;完全控制账户 恶意多签成因 在区块链中&#xff0c;多签&#xff08;M…

二月公开赛Web-ssrfme

目录 环境搭建 题目分析 分析代码 解题过程 Redis未授权访问 寻找Flag 环境搭建 进入含有docker-compose.yml的文件内&#xff0c;拉取容器镜像 docker-compose up -d 题目分析 访问容器地址172.25.254.200:8091查看题目 分析代码 url通过GET请求访问界面&#xff0c…

告别枯燥工作,走向自动化

嘿&#xff0c;小伙伴们&#xff01;今天给你们介绍两款超实用的RPA办公自动化软件&#xff0c;用它们&#xff0c;再也不用像机器一样做重复劳动啦&#xff0c;超省时间&#xff01; 工具名称&#xff1a;影刀RPA&#xff08;类似产品&#xff0c;八爪鱼 RPA&#xff0c;操作上…

可信数据空间:构筑安全可控数据流通

前言&#xff1a;可信数据空间是一种数据基础设施&#xff0c;发展可信数据空间是全国及各地数据基础设施建设的重要方面。国内数据空间的探索和实践仍然数据探索阶段。本期分享&#xff1a;可信数据空间构筑安全可控数据流通&#xff0c;包括可信数据空间技术介绍、如何助力数…

Zookeeper特性与节点数据类型

数据结构和监听机制 CP 文件系统形式存储 观察者模式监听节点数据变化、 临时节点客户端超时或发生异常节点就会删除 2888同步数据 3888选举端口 1.什么是Zookeeper ZooKeeper 是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来…

处理 Linux 信号:进程控制与异常管理的核心

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在 Linux 操作系统中&#xff0c;信号是用于进程间通信的一种机制&#xff0c;能够向进程发送通知&#xff0c;指示某些事件的发生。信号通常由操作系统内核、硬件中断或其他进程发送。接收和处理信号是 Li…

【蓝桥杯每日一题】4.1

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x "今日秃头刷题&#xff0c;明日荣耀加冕&#xff01;" 今天我们来练习二分算法 不熟悉二分算法的朋友可以看&#xff1a;【C语言刷怪篇】二分法_编程解决算术问题-CSDN博客 …

分享系列项目的基础项目

本人分享了一系列的框架项目&#xff0c;它们共同需要依赖这个公共基础&#xff0c;结构如下图所示&#xff1a; 其中&#xff1a; audit: JPA的审计信息基础类auth&#xff1a;认证授权相关类config: 包括redis配置&#xff0c;client中token配置&#xff0c;openai文档配置…