在嵌入式开发、物联网设备或资源受限的环境中,C语言因其高效性和低开销被广泛使用。然而,C语言本身并不原生支持JSON格式的数据处理。这时,cJSON 库就派上了大用场!本文将带你从零开始,详细讲解如何在C语言项目中使用 cJSON 库进行 JSON 的解析与生成,即使是编程小白也能轻松上手。
什么是 cJSON?
cJSON 是一个轻量级、开源的 C 语言 JSON 解析器和生成器,由 Dave Gamble 开发。它仅依赖标准 C 库,代码简洁、易于集成,非常适合用于嵌入式系统或对性能要求较高的场景。通过 cJSON,你可以轻松地将 JSON 字符串转换为 C 结构,或将 C 数据结构序列化为 JSON 字符串。
安装与集成 cJSON
cJSON 使用非常简单,你只需要两个文件:cJSON.c 和 cJSON.h。你可以从其 GitHub 仓库 下载源码。
将这两个文件复制到你的项目目录中,并在你的 C 源文件中包含头文件:
#include "cJSON.h"
编译时记得链接 cJSON 源文件,例如使用 gcc 编译:
gcc main.c cJSON.c -lm -o my_program
注意:cJSON 使用了数学库(如 pow),所以需要加上 -lm 参数。
解析 JSON 字符串(反序列化)
假设我们有一个 JSON 字符串,表示用户信息:
{ "name": "张三", "age": 28, "is_student": false, "hobbies": ["读书", "编程", "旅行"]}
我们可以使用 cJSON 来解析它并提取字段:
#include <stdio.h>#include <stdlib.h>#include "cJSON.h"int main() { const char *json_str = "{\"name\":\"张三\",\"age\":28,\"is_student\":false,\"hobbies\":[\"读书\",\"编程\",\"旅行\"]}"; // 解析 JSON 字符串 cJSON *root = cJSON_Parse(json_str); if (root == NULL) { const char *error_ptr = cJSON_GetErrorPtr(); if (error_ptr != NULL) { fprintf(stderr, "解析错误: %s\n", error_ptr); } return 1; } // 获取 name 字段 cJSON *name = cJSON_GetObjectItemCaseSensitive(root, "name"); if (cJSON_IsString(name) && (name->valuestring != NULL)) { printf("姓名: %s\n", name->valuestring); } // 获取 age 字段 cJSON *age = cJSON_GetObjectItemCaseSensitive(root, "age"); if (cJSON_IsNumber(age)) { printf("年龄: %d\n", age->valueint); } // 获取 hobbies 数组 cJSON *hobbies = cJSON_GetObjectItemCaseSensitive(root, "hobbies"); if (cJSON_IsArray(hobbies)) { int size = cJSON_GetArraySize(hobbies); printf("爱好 (%d 项): ", size); for (int i = 0; i < size; i++) { cJSON *item = cJSON_GetArrayItem(hobbies, i); if (cJSON_IsString(item)) { printf("%s ", item->valuestring); } } printf("\n"); } // 释放内存 cJSON_Delete(root); return 0;}
运行后输出:
姓名: 张三年龄: 28爱好 (3 项): 读书 编程 旅行
生成 JSON 字符串(序列化)
除了解析,cJSON 还能帮你构建 JSON 对象。下面是一个创建用户信息 JSON 的例子:
#include <stdio.h>#include "cJSON.h"int main() { // 创建根对象 cJSON *root = cJSON_CreateObject(); // 添加字符串字段 cJSON_AddStringToObject(root, "name", "李四"); // 添加数字字段 cJSON_AddNumberToObject(root, "age", 22); // 添加布尔字段 cJSON_AddBoolToObject(root, "is_student", 1); // 创建数组并添加元素 cJSON *hobbies = cJSON_CreateArray(); cJSON_AddItemToArray(hobbies, cJSON_CreateString("游泳")); cJSON_AddItemToArray(hobbies, cJSON_CreateString("音乐")); cJSON_AddItemToObject(root, "hobbies", hobbies); // 将 cJSON 对象转为字符串 char *json_str = cJSON_Print(root); if (json_str != NULL) { printf("生成的 JSON:\n%s\n", json_str); free(json_str); // cJSON_Print 返回的是 malloc 分配的内存 } // 释放 cJSON 对象 cJSON_Delete(root); return 0;}
输出结果:
生成的 JSON:{ "name": "李四", "age": 22, "is_student": true, "hobbies": ["游泳", "音乐"]}
常见注意事项
- 每次调用
cJSON_Parse或cJSON_CreateObject后,必须调用cJSON_Delete释放内存,避免内存泄漏。 - 使用
cJSON_Print生成的字符串是动态分配的,记得用free()释放。 - 检查指针是否为 NULL,以及使用
cJSON_IsXXX宏判断类型,可提高程序健壮性。
总结
通过本教程,你已经掌握了 cJSON库使用教程 的核心内容,包括如何解析和生成 JSON 数据。无论你是做 C语言JSON解析、开发嵌入式设备,还是学习 cJSON入门指南,cJSON 都是一个强大而简单的工具。对于资源有限的系统,嵌入式JSON处理 能力尤为重要,而 cJSON 正是为此而生。
赶快动手试试吧!如有疑问,欢迎查阅 cJSON 官方文档或在评论区留言交流。
来源:
https://www.vpshk.cn/