在嵌入式开发、物联网设备或资源受限的环境中,C语言因其高效性和低开销被广泛使用。然而,C语言本身并不原生支持JSON格式的数据处理。这时,cJSON 库就派上了大用场!本文将带你从零开始,详细讲解如何在C语言项目中使用 cJSON 库进行 JSON 的解析与生成,即使是编程小白也能轻松上手。
cJSON 是一个轻量级、开源的 C 语言 JSON 解析器和生成器,由 Dave Gamble 开发。它仅依赖标准 C 库,代码简洁、易于集成,非常适合用于嵌入式系统或对性能要求较高的场景。通过 cJSON,你可以轻松地将 JSON 字符串转换为 C 结构,或将 C 数据结构序列化为 JSON 字符串。
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 字符串,表示用户信息:
{ "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 项): 读书 编程 旅行 除了解析,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() 释放。cJSON_IsXXX 宏判断类型,可提高程序健壮性。通过本教程,你已经掌握了 cJSON库使用教程 的核心内容,包括如何解析和生成 JSON 数据。无论你是做 C语言JSON解析、开发嵌入式设备,还是学习 cJSON入门指南,cJSON 都是一个强大而简单的工具。对于资源有限的系统,嵌入式JSON处理 能力尤为重要,而 cJSON 正是为此而生。
赶快动手试试吧!如有疑问,欢迎查阅 cJSON 官方文档或在评论区留言交流。
本文由主机测评网于2025-12-29发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/20251213757.html