当前位置: 首页 > news >正文

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

第二部分: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

相关文章:

  • 蓝桥杯备赛:动态规划入门
  • 架构设计基础系列:面向对象设计的原则
  • 【Spring Boot 与 Spring Cloud 深度 Mape 之三】服务注册与发现:Nacos 核心实战与原理浅析
  • 【Easylive】服务端操作 Cookie 的完整流程(结合案例解析)
  • APIPost接口测试完整流程指南
  • java学习笔记11——泛型
  • 【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
  • Python WebSockets 库详解:从基础到实战
  • MySQL 5.7 Online DDL 技术深度解析
  • C++和C#接口对应关系
  • 【运维】Centos硬盘满导致开机时处于加载状态无法开机解决办法
  • Docker基础详解
  • Linux 高级路由策略控制配置:两个不同路由子网间通信
  • 沉浸式体验测评|AI Ville:我在Web3小镇“生活”了一周
  • 基于MODIS观测的全球格点数据处理与GeoTIFF栅格化存储
  • 新闻发布管理系统带万字文档新闻管理系统java项目java课程设计java毕业设计
  • ES5内容之String接口
  • python-leetcode 62.搜索插入位置
  • 阻止上传可执行程序
  • 实现Excel导入和导出
  • 冯德莱恩:欧美贸易谈判前不会前往美国会见特朗普
  • 中俄弘扬正确二战史观:缅怀历史,重拾初心,阻止悲剧重演
  • 碧桂园境外债务重组:相当于现有公众票据本金额逾50%的持有人已加入协议
  • 壹基金发布2024年度报告,公益项目惠及937万人次
  • 七大交响乐团在沪“神仙斗法”,时代交响奏出何等时代新声
  • 俄罗斯今日将举行“胜利日”阅兵,有何看点?