C语言中JSON怎么解析?cJSON库的安装和使用教程

来源:站长查询作者:湖南程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《C语言中JSON怎么解析?cJSON库的安装和使用教程》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C语言中JSON怎么解析?cJSON库的安装和使用教程》有用,将其分享出去将是对创作者最好的鼓励。

在C语言开发中,处理JSON格式数据是常见需求,cJSON作为轻量高效的JSON解析库被广泛应用,它完全用C语言编写,没有额外的依赖,适合嵌入式和常规C项目使用。

C语言中JSON怎么解析?cJSON库的安装和使用教程

cJSON库的安装

cJSON是开源库,我们可以从官方仓库获取源码进行安装,步骤如下:

  • 首先从开源仓库下载cJSON的源码包,解压后得到cJSON.c和cJSON.h两个核心文件
  • 如果是Linux系统,可以将这两个文件放到项目目录中,编译时一起参与编译,也可以安装到系统目录:
# 进入解压后的cJSON目录
make
sudo make install
# 安装后头文件会放到/usr/local/include,库文件放到/usr/local/lib
  • 如果是Windows系统,直接将cJSON.c和cJSON.h添加到你的项目工程中即可,编译时会自动处理

cJSON核心数据结构

cJSON库的核心数据结构是cJSON结构体,定义如下:

typedef struct cJSON {
    struct cJSON *next; // 下一个节点
    struct cJSON *prev; // 上一个节点
    struct cJSON *child; // 子节点,用于数组和对象类型
    int type; // 节点类型,如cJSON_Number、cJSON_String等
    char *valuestring; // 字符串类型的值
    int valueint; // 整数类型的值
    double valuedouble; // 浮点数类型的值
    char *string; // 对象的键名
} cJSON;

常用的类型宏定义包括:cJSON_False、cJSON_True、cJSON_NULL、cJSON_Number、cJSON_String、cJSON_Array、cJSON_Object。

cJSON常用API介绍

解析相关API

  • cJSON_Parse(const char *value):将JSON字符串解析为cJSON对象,解析失败返回NULL
  • cJSON_GetObjectItem(const cJSON *object, const char *string):从JSON对象中获取指定键名的子节点
  • cJSON_GetArrayItem(const cJSON *array, int index):从JSON数组中获取指定下标的元素
  • cJSON_GetArraySize(const cJSON *array):获取JSON数组的长度

释放相关API

  • cJSON_Delete(cJSON *c):释放整个cJSON对象的内存,必须调用避免内存泄漏

创建相关API

  • cJSON_CreateObject():创建一个JSON对象
  • cJSON_CreateArray():创建一个JSON数组
  • cJSON_CreateString(const char *string):创建一个字符串类型的JSON节点
  • cJSON_CreateNumber(double num):创建一个数字类型的JSON节点
  • cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item):向JSON对象中添加键值对
  • cJSON_AddItemToArray(cJSON *array, cJSON *item):向JSON数组中添加元素
  • cJSON_Print(const cJSON *item):将cJSON对象转换为格式化的JSON字符串
  • cJSON_PrintUnformatted(const cJSON *item):将cJSON对象转换为无格式的JSON字符串

解析JSON字符串示例

假设我们要解析如下的JSON字符串:

{
    "name": "张三",
    "age": 25,
    "is_student": false,
    "hobbies": ["篮球", "阅读", "编程"],
    "address": {
        "city": "北京",
        "street": "中关村大街"
    }
}

解析代码如下:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int main() {
    // 待解析的JSON字符串
    char *json_str = "{"name":"张三","age":25,"is_student":false,"hobbies":["篮球","阅读","编程"],"address":{"city":"北京","street":"中关村大街"}}";
    
    // 解析JSON字符串
    cJSON *root = cJSON_Parse(json_str);
    if (root == NULL) {
        printf("JSON解析失败n");
        return -1;
    }
    
    // 解析name字段
    cJSON *name = cJSON_GetObjectItem(root, "name");
    if (name != NULL && name->type == cJSON_String) {
        printf("姓名:%sn", name->valuestring);
    }
    
    // 解析age字段
    cJSON *age = cJSON_GetObjectItem(root, "age");
    if (age != NULL && age->type == cJSON_Number) {
        printf("年龄:%dn", age->valueint);
    }
    
    // 解析is_student字段
    cJSON *is_student = cJSON_GetObjectItem(root, "is_student");
    if (is_student != NULL && is_student->type == cJSON_False) {
        printf("是否学生:否n");
    } else if (is_student != NULL && is_student->type == cJSON_True) {
        printf("是否学生:是n");
    }
    
    // 解析hobbies数组
    cJSON *hobbies = cJSON_GetObjectItem(root, "hobbies");
    if (hobbies != NULL && hobbies->type == cJSON_Array) {
        int size = cJSON_GetArraySize(hobbies);
        printf("爱好:");
        for (int i = 0; i < size; i++) {
            cJSON *hobby = cJSON_GetArrayItem(hobbies, i);
            if (hobby != NULL && hobby->type == cJSON_String) {
                printf("%s ", hobby->valuestring);
            }
        }
        printf("n");
    }
    
    // 解析嵌套的address对象
    cJSON *address = cJSON_GetObjectItem(root, "address");
    if (address != NULL && address->type == cJSON_Object) {
        cJSON *city = cJSON_GetObjectItem(address, "city");
        cJSON *street = cJSON_GetObjectItem(address, "street");
        if (city != NULL && city->type == cJSON_String && street != NULL && street->type == cJSON_String) {
            printf("地址:%s %sn", city->valuestring, street->valuestring);
        }
    }
    
    // 释放cJSON对象内存
    cJSON_Delete(root);
    return 0;
}

编译运行上述代码,需要先链接cJSON库,Linux下编译命令为:

gcc test.c -o test -lcjson

创建JSON字符串示例

下面演示如何使用cJSON创建一个JSON对象并转换为字符串:

#include <stdio.h>
#include <stdlib.h>
#include "cJSON.h"

int main() {
    // 创建根对象
    cJSON *root = cJSON_CreateObject();
    
    // 添加基本类型字段
    cJSON_AddItemToObject(root, "name", cJSON_CreateString("李四"));
    cJSON_AddItemToObject(root, "age", cJSON_CreateNumber(30));
    cJSON_AddItemToObject(root, "is_employed", cJSON_CreateBool(1));
    
    // 创建数组并添加到根对象
    cJSON *skills = cJSON_CreateArray();
    cJSON_AddItemToArray(skills, cJSON_CreateString("C语言"));
    cJSON_AddItemToArray(skills, cJSON_CreateString("Linux"));
    cJSON_AddItemToArray(skills, cJSON_CreateString("嵌入式开发"));
    cJSON_AddItemToObject(root, "skills", skills);
    
    // 创建嵌套对象并添加到根对象
    cJSON *company = cJSON_CreateObject();
    cJSON_AddItemToObject(company, "name", cJSON_CreateString("某科技公司"));
    cJSON_AddItemToObject(company, "position", cJSON_CreateString("嵌入式工程师"));
    cJSON_AddItemToObject(root, "company", company);
    
    // 转换为格式化的JSON字符串
    char *json_str = cJSON_Print(root);
    printf("生成的JSON字符串:n%sn", json_str);
    
    // 释放内存
    free(json_str);
    cJSON_Delete(root);
    return 0;
}

注意事项

  • 每次调用cJSON_Parse解析得到的cJSON对象,使用完后必须调用cJSON_Delete释放,否则会造成内存泄漏
  • 获取节点后要先判断节点类型是否符合预期,避免类型错误导致的程序异常
  • 调用cJSON_PrintcJSON_PrintUnformatted得到的字符串,使用完后需要调用free释放
  • 如果项目是多线程环境,需要注意cJSON本身不是线程安全的,多线程操作同一个cJSON对象需要加锁保护

cJSONJSON解析C语言修改时间:2026-07-19 01:45:35

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。