C语言中高效处理JSON数据(cJSON库使用教程与入门指南)

简介: cJSON 是轻量级C语言JSON库,适用于嵌入式系统,支持JSON解析与生成。本文详解其安装、使用方法及注意事项,助力C语言开发者高效处理JSON数据,适合初学者入门。

在嵌入式开发、物联网设备或资源受限的环境中,C语言因其高效性和低开销被广泛使用。然而,C语言本身并不原生支持JSON格式的数据处理。这时,cJSON 库就派上了大用场!本文将带你从零开始,详细讲解如何在C语言项目中使用 cJSON 库进行 JSON 的解析与生成,即使是编程小白也能轻松上手。

什么是 cJSON?

cJSON 是一个轻量级、开源的 C 语言 JSON 解析器和生成器,由 Dave Gamble 开发。它仅依赖标准 C 库,代码简洁、易于集成,非常适合用于嵌入式系统或对性能要求较高的场景。通过 cJSON,你可以轻松地将 JSON 字符串转换为 C 结构,或将 C 数据结构序列化为 JSON 字符串。

安装与集成 cJSON

cJSON 使用非常简单,你只需要两个文件:cJSON.ccJSON.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_ParsecJSON_CreateObject 后,必须调用 cJSON_Delete 释放内存,避免内存泄漏。
  • 使用 cJSON_Print 生成的字符串是动态分配的,记得用 free() 释放。
  • 检查指针是否为 NULL,以及使用 cJSON_IsXXX 宏判断类型,可提高程序健壮性。

总结

通过本教程,你已经掌握了 cJSON库使用教程 的核心内容,包括如何解析和生成 JSON 数据。无论你是做 C语言JSON解析、开发嵌入式设备,还是学习 cJSON入门指南,cJSON 都是一个强大而简单的工具。对于资源有限的系统,嵌入式JSON处理 能力尤为重要,而 cJSON 正是为此而生。

赶快动手试试吧!如有疑问,欢迎查阅 cJSON 官方文档或在评论区留言交流。

来源:

https://www.vpshk.cn/

相关文章
|
11天前
|
数据采集 人工智能 安全
|
7天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
338 164
|
6天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
343 155
|
7天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
534 4
|
14天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
984 7