第二部分:cJSON 处理 JSON(轻量级 C 语言库)
📢 快速掌握 cJSON!文章 + 视频双管齐下 🚀
如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 cJSON 课程视频!🎬 视频里会用更直观的方式讲解 cJSON 的核心概念、实战技巧,并配有动手演示,让你更高效地掌握 JSON 的处理方法!
当然,如果你喜欢深度阅读,这篇文章会帮助你系统地理解 cJSON,从基础到进阶!无论你选择哪种方式,最终目标都是让你成为 cJSON 处理的高手!💪
🎥 点击这里观看视频 👉 视频链接
一:cJSON 库概述与环境配置
1.1 cJSON 简介(特点、适用场景)
- cJSON 是一个轻量级、开源的 C 语言 JSON 解析库,专门用于处理 JSON 格式数据。它具有以下特点:
- 简单易用,API 设计清晰,代码可读性强。
- 轻量级,适用于嵌入式系统、物联网(IoT)等对资源敏感的应用场景。
- 无需额外依赖,仅需一个
cJSON.c
和cJSON.h
文件即可使用。
1.2 下载和安装 cJSON
方法 1:直接下载 cJSON 源码
-
从 cJSON 官方 GitHub 下载
cJSON.h
和cJSON.c
。https://github.com/DaveGamble/cJSON
-
在项目中包含 cJSON.h:
#include "cJSON.h"
-
编译时需链接 cJSON.c:
gcc main.c cJSON.c -o main
方法 2:使用 CMake 进行安装
-
克隆 cJSON 源码:
git clone https://github.com/DaveGamble/cJSON.git cd cJSON
-
使用 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 文件
- 创建
config.json
:
{
"server": "192.168.1.1",
"port": 8080,
"debug": true
}
- 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