C 开源库之cJSON

cJSON简介

CJSON库是一个用于解析和生成JSON数据的C语言库。 它提供了一组函数,使得在C语言中操作JSON数据变得简单而高效。 您可以使用CJSON库来解析从服务器返回的JSON数据,或者将C语言数据结构转换为JSON格式以进行传输。

cJSON 使用

官网地址:https://sourceforge.net/projects/cjson/

cJSON只有一个cjson.h 和cjson.c 文件,可以很方便的集成到其他项目中。cJSON支持将JSON数据解析为cJSON对象,也支持将cJSON对象转换为JSON数据。cJSON的使用非常简单,只需要包含 cjson.h 头文件,然后调用相应的API即可完成JSON数据的解析和生成。

cJSON 数据生成

新增cjson_demo1.c 文件

复制代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "cJSON.h"
/**
 * 目标:1、引入cjson 库依赖文件(cJSON.c/cJSON.h)
 *      2、cjson 库基本使用 
 */
int main(){
    // 第一步:创建cJSON 对象
    cJSON *jsonObject = cJSON_CreateObject();
    // 第二步:输出cJSON 对象
    char *content = cJSON_Print(jsonObject);
    printf("%s\n",  content);
    // 第三步:cJSON 对象添加属性:基本属性之字符串
    cJSON_AddItemToObject(jsonObject, "name", cJSON_CreateString("周志刚"));
    content = cJSON_Print(jsonObject);
    printf("%s\n",  content);
     // 第三步:cJSON 对象添加属性:基本属性之整形
    cJSON_AddItemToObject(jsonObject, "age", cJSON_CreateNumber(32));
    content = cJSON_Print(jsonObject);
    printf("%s\n",  content);
     // 第三步:cJSON 对象添加属性:基本属性之bool
    cJSON_AddItemToObject(jsonObject, "man", cJSON_CreateBool(1));
    content = cJSON_Print(jsonObject);
    printf("%s\n",  content);
    // 第三步:cJSON 对象添加属性:基本属性之NULL
    cJSON_AddItemToObject(jsonObject, "woman", cJSON_CreateNull());
    content = cJSON_Print(jsonObject);
    printf("%s\n",  content);
    // 第四步:cJSON 对象添加属性:复杂属性之数组
    cJSON * childs = cJSON_CreateArray();
    cJSON_AddItemToArray(childs, cJSON_CreateString("周晨曦"));
    cJSON_AddItemToArray(childs, cJSON_CreateString("周晨宇"));
    cJSON_AddItemToObject(jsonObject, "childs", childs);
    content = cJSON_Print(jsonObject);
    printf("%s\n",  content);
    // 第四步:cJSON 对象添加属性:复杂属性之cJSON对象
    cJSON *wife = cJSON_CreateObject();
    cJSON_AddItemToObject(wife, "name", cJSON_CreateString("王珍"));
    cJSON_AddItemToObject(jsonObject, "wife", wife);
    content = cJSON_Print(jsonObject);
    printf("%s\n",  content);

    // 第五步:输出json 字符串到指定文件
    FILE *file = fopen("output.json", "w+");
    if(file == NULL){
        perror("fopen failed !!\n");
        return -1;
    }
    char buffer[1024];
    // 初始化
    memset(buffer, 0,1024);
    // 赋值
    strcpy(buffer, content);
    int length = strlen(buffer);
    // 文件写入
    if(fwrite(buffer, length, 1, file) <=0){
        perror("fwrite failed !!\n");
        return -1;
    } 
    // 文件关闭
    fclose(file);

    // 释放cJSON 对象和字符串
    cJSON_Delete(jsonObject);

    free(content);
    return 0;
}

编译:gcc cJSON.c cjson_demo1.c -o cjson_demo1 -lm

执行:./cjson_demo1

执行效果:

cJSON 数据解析

新增cjson_demo2.c 文件

复制代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "cJSON.h"
/**
 * 目标:1、引入cjson 库依赖文件(cJSON.c/cJSON.h)
 *      2、cjson 库基本使用 
 */
int main(){
  
    // 第一步:从指定文件读取json 字符串
    FILE *file = fopen("output.json", "r");
    if(file == NULL){
        perror("fopen failed !!\n");
        return -1;
    }
    char buffer[1024];
    // 初始化
    memset(buffer, 0,1024);
    // 文件读取
    fread(buffer, 1024, 1, file);
    // 文件关闭
    fclose(file);

     // 第二步:解析json 字符串
     cJSON *jsonObject = cJSON_Parse(buffer);
     if(jsonObject == NULL){
        perror("Parse failed!\n");
        return -1;

     }
     // 第三步:解析键值对
    cJSON *name =cJSON_GetObjectItem(jsonObject, "name");
    char *content = cJSON_Print(name);
    printf("%s\n",  content);

    // 第四步: 解析JSON对象
    cJSON *wife = cJSON_GetObjectItem(jsonObject, "wife");
    content = cJSON_Print(wife);
    printf("%s\n",  content);

    // 第五步: 解析JSON数组
    cJSON *childs = cJSON_GetObjectItem(jsonObject, "childs");
    content = cJSON_Print(childs);
    printf("%s\n",  content);


     // 释放cJSON 对象和字符串
    cJSON_Delete(jsonObject);

    free(content);

    return 0;
}

编译:gcc cJSON.c cjson_demo2.c -o cjson_demo2 -lm

执行:./cjson_demo2

执行效果:

cJSON 问题

问题一:找不到pow和floor函数:undefined reference to pow' 和 undefined reference tofloor'

解决办法: 编译需要添加math库/libm,在编译代码中添加"-lm"。

相关推荐
兆龙电子单片机设计2 分钟前
【STM32项目开源】STM32单片机智能恒温箱控制系统
stm32·单片机·物联网·开源·毕业设计
大写-凌祁6 分钟前
零基础入门深度学习:从理论到实战,GitHub+开源资源全指南(2025最新版)
人工智能·深度学习·开源·github
CodeCraft Studio32 分钟前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64
开发语言·python·pdf·base64·aspose·aspose.pdf
零点零一33 分钟前
VS+QT的编程开发工作:关于QT VS tools的使用 qt的官方帮助
开发语言·qt
lingchen19063 小时前
MATLAB的数值计算(三)曲线拟合与插值
开发语言·matlab
索迪迈科技3 小时前
基于野火F407开发板实现电源管理-停止模式
c语言·stm32·单片机·嵌入式硬件·mcu
gb42152873 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go3 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
蒋星熠3 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小莞尔3 小时前
【51单片机】【protues仿真】基于51单片机宠物投食系统
c语言·stm32·单片机·嵌入式硬件·51单片机