cjson常用API使用总结
json
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端数据传输和存储。在C语言中,我们可以使用cjson库来处理JSON数据。本问总结了在使用cjson库中各个常用API的用法,包括组装JSON(包括对象、数组、字符串等),以及解析JSON(解析对象、数组、字符串等)。
1. cjson库简介
cjson是一个轻量级的C语言库,用于处理JSON数据。它提供了简单易用的API,能够方便地将C语言中的数据转换成JSON格式,以及将JSON格式的数据解析成C语言中的数据。
2. JSON对象的组装
2.1 组装JSON对象
要组装一个JSON对象,可以使用以下API:
//先创建一个cJSON对象头指针
cJSON *cJSON_CreateObject(void);
//添加一个对象到另一个对象,实现嵌套
void cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
注意事项:
- 在调用
cJSON_CreateObject
后,返回的指针需要通过cJSON_Delete
进行内存释放,以防止内存泄漏。 - 使用
cJSON_AddItemToObject
将各个子项添加到JSON对象中,其中string
是子项的键名,item
是子项的值,可以是数字、字符串、数组等其他JSON类型。
示例:
{
“age”:30
“name” :“John”
“is_student”:1
}
#include <stdio.h>
#include "cJSON.h"int main() {// 组装JSON对象cJSON *jsonObj = cJSON_CreateObject();// 添加数字到JSON对象中cJSON_AddNumberToObject(jsonObj, "age", 30);// 添加字符串到JSON对象中cJSON_AddStringToObject(jsonObj, "name", "John");// 添加布尔值到JSON对象中,这里用1表示truecJSON_AddBoolToObject(jsonObj, "is_student", 1);// 将JSON对象转换成字符串会开辟一个新内存,调用此函数记得手动释放char *jsonStr = cJSON_Print(jsonObj);printf("JSON Object:\n%s\n", jsonStr);// 释放JSON对象的内存cJSON_Delete(jsonObj);// 释放JSON字符串的内存free(jsonStr);return 0;
}
2.2 组装JSON数组
要组装一个JSON数组,可以使用以下API:
cJSON *cJSON_CreateArray(void);
void cJSON_AddItemToArray(cJSON *array, cJSON *item);
注意事项:
- 在调用
cJSON_CreateArray
后,返回的指针需要通过cJSON_Delete
进行内存释放,以防止内存泄漏。 - 如果将cJSON_CreateArray数组对象添加到其他对象中作为子对象时,只需释放总JSON头部即可。
- 使用
cJSON_AddItemToArray
将各个子项添加到JSON数组中,item
是子项的值,可以是数字、字符串、对象等其他JSON类型。
示例:
{
“logList”: [{
“logName”: “f1”,
“logSize”: 1357,
“logTime”: “2023-07-24 15:19:25”
}
…//可添加
]
}
#include <stdio.h>
#include "cJSON.h"int main() {// 创建 JSON 格式的根对象cJSON *root = cJSON_CreateObject();cJSON *jsonArray = cJSON_CreateArray();//创建子对象cJSON *logEntry = cJSON_CreateObject();cJSON_AddStringToObject(logEntry, "logName", filename);cJSON_AddStringToObject(logEntry, "logSize", 100);cJSON_AddStringToObject(logEntry, "logTime","2023-07-24 15:19:25");//对象的相互嵌套不受顺序影响//将logentry插入到jsonarray数组中cJSON_AddItemToArray(jsonArray , logEntry);//将数组插入到跟对象cJSON_AddItemToObject(root, "jsonArray ", jsonArray );char *jsonStr = cJSON_Print(root);printf("JSON Array:\n%s\n", jsonStr);cJSON_Delete(root); // 释放root内存free(jsonStr); // 释放jsonStr内存return 0;
}
3. JSON对象的解析
3.1 解析JSON对象
要解析JSON中的对象,可以使用以下API:
cJSON *cJSON_Parse(const char *value);
cJSON *cJSON_GetObjectItem(const cJSON *object, const char *string);
注意事项:
- 在调用
cJSON_Parse
后,返回的指针需要通过cJSON_Delete
进行内存释放,以防止内存泄漏。 - 使用
cJSON_GetObjectItem
根据键名获取JSON对象中的子项。
示例:
{
“age”:30
“name” :“John”
“is_student”:true
}
#include <stdio.h>
#include "cJSON.h"int main() {const char *jsonStr = "{\"name\":\"John\",\"age\":30,\"is_student\":true}";cJSON *jsonObj = cJSON_Parse(jsonStr);if (jsonObj != NULL) {//解析跟每个子对象的顺序无关cJSON *nameObj = cJSON_GetObjectItem(jsonObj, "name");cJSON *ageObj = cJSON_GetObjectItem(jsonObj, "age");cJSON *isStudentObj = cJSON_GetObjectItem(jsonObj, "is_student");if (nameObj != NULL && cJSON_IsString(nameObj)) {printf("Name: %s\n", nameObj->valuestring);}if (ageObj != NULL && cJSON_IsNumber(ageObj)) {printf("Age: %d\n", ageObj->valueint);}if (isStudentObj != NULL && cJSON_IsBool(isStudentObj)) {printf("Is Student: %s\n", isStudentObj->valueint ? "true" : "false");}cJSON_Delete(jsonObj); // 释放jsonObj内存} else {printf("JSON parsing failed!\n");}return 0;
}
3.2 解析JSON数组
要解析JSON中的数组,可以使用以下API:
cJSON *cJSON_Parse(const char *value);
cJSON *cJSON_GetArrayItem(const cJSON *array, int index);
注意事项:
- 在调用
cJSON_Parse
后,返回的指针需要通过cJSON_Delete
进行内存释放,以防止内存泄漏。 - 使用
cJSON_GetArrayItem
根据索引获取JSON数组中的子项。
示例:
{
[ apple,
123,
true
]
}
#include <stdio.h>
#include "cJSON.h"int main() {const char *jsonStr = "[\"apple\", 123, true]";cJSON *jsonArray = cJSON_Parse(jsonStr);if (jsonArray != NULL && cJSON_IsArray(jsonArray)) {int arraySize = cJSON_GetArraySize(jsonArray);for (int i = 0; i < arraySize; i++) {cJSON *item = cJSON_GetArrayItem(jsonArray, i);if (cJSON_IsString(item)) {printf("Array Item %d: %s\n", i, item->valuestring);} else if (cJSON_IsNumber(item)) {printf("Array Item %d: %d\n", i, item->valueint);} else if (cJSON_IsBool(item)) {printf("Array Item %d: %s\n", i, item->valueint ? "true" : "false");}}cJSON_Delete(jsonArray); // 释放jsonArray内存} else {printf("JSON parsing failed!\n");}return 0;
}
相关文章:
cjson常用API使用总结
json JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端数据传输和存储。在C语言中,我们可以使用cjson库来处理JSON数据。本问总结了在使用cjson库中各个常用API的用法,包括组装JSON&#x…...
Shell脚本学习-case语句开发rsync服务的脚本
利用case语句开发类似系统启动rsync启动服务的脚本。(可以参考系统rpcbind、nfs的脚本)。 例如: /etc/init.d/rsyncd {start | stop | restart } rsync --daemon pkill rsync [rootvm1 scripts]# cat start_rsync.sh #!/bin/bash #[ -f /…...

使用docker部署一个jar项目
简介: 通过docker镜像, docker可以在服务器上运行包含项目所需运行环境的docker容器, 在线仓库里有很多各个软件公司官方发布的镜像, 或者第三方的镜像. 如果我们需要使用docker把我们的应用程序打包成镜像, 别的机器上只要安装了docker, 就可以直接运行镜像, 而不需要再安装应…...

【Linux命令200例】tee将输入内容输出到屏幕和文件
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆本文已收录于专栏:Linux命令大全。 🏆本专栏我们会通过具体的系统的命令讲解加上鲜…...

使用Vue+CSS实现汉堡图标过渡为叉号图标,有点意思
前言 本文给大家分享三个具有过渡效果的汉堡图标,当点击汉堡图标时,过渡为叉号图标。这种具有过渡特效的图标挺炫酷的,感觉一下子给网页增加一点新颖特色。早在2015年左右,国外挺多优秀门户网站都有使用类似的图标,那…...

python面试题【题目+答案】
最近遇到了一份python的面试题,题目比较简单,时间控制在一个小时之内。以下是面试的题目跟答案,答案不代表最优解,只是当时所想到的一些思路,接下来将分享给大家。 目录 1. 给出下面打印结果 2.字典如何删除键、如何…...
Rocky(centos) jar 注册成服务,能开机自启动
概述 涉及:1)sh 无法直接运行java命令,可以软连,此处是直接路径 2)sh脚本报一堆空格换行错误:需将转成unix标准格式; #切换到上传的脚本路径 dos2unix 脚本文件名.sh 2)SELINUX …...
科大讯飞-鸟类分类挑战赛-测试【1】
科大讯飞-鸟类分类挑战赛-测试【1】 1. 比赛说明2. EfficientNet测试2.1 **模型搭建:**2.2 **模型训练:**2.3 训练过程可视化2.4 一些报错解决:1. 比赛说明 背景: 随着生态环境的不断变化和人类对自然资源的过度开发,世界各地的鸟类数量和种类正在发生着巨大的变化。为了更…...
两行CSS让页面提升渲染性能
content-visibility是CSS新增的属性,主要用来提高页面渲染性能,它可以控制一个元素是否渲染其内容,并且允许浏览器跳过这些元素的布局与渲染。 content-visibility: hidden的效果与display: none类似其区别在于: content-visibi…...

UniApp中tabbar设置了position: fixed以及bottom:0后出现一条缝隙,看到了后面的内容
问题描述 解决方法 直接将bottom设置成-2px即可...

设计模式行为型——责任链模式
目录 什么是责任链模式 责任链模式的实现 责任链模式角色 责任链模式类图 责任链模式举例 责任链模式代码实现 责任链模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是责任链模式 责任链模式(Chain of Responsibility Pattern)又叫职…...
Xamarin.Android中Intent的使用
目录 1、说明2、使用方法2.1 常用方法2.2 调用系统应用 3、参考资料 1、说明 在Android开发中常常会用到Intent进行不同活动启动,整理资料如下 2、使用方法 2.1 常用方法 1、一般情况而言,都是使用如下的方式进行调用 Intent intent new Intent(th…...

matplotlib绘制方波圆周分解动画
1 方波的圆周分解 在学习傅里叶变换的时候,有一个经典的示例是方波的分解。我们知道,方波可以分解为无数个正弦波的叠加。而正弦波,又可以看作是圆周运动在一条直线上的投影。当时为了理解这个事情,恐怕大家也花了不少时间。 学…...
vue3+ts 实现枚举
首先 index.ts 中定义枚举 export const fruit [{key:1,name:苹果,},{key:11,name:草莓},{key:5,name:香蕉,},{key:51,name:葡萄,},{key:6,name:橙子},{key:7,name:哈密瓜},{key:10,name:西瓜}, ]; 接口返给的数据是一个对象 feeMap{ 1:200, 2&…...

【Python】5分钟了解11个最佳的Python编译器和解释器
11个最佳Python编译器和解释器 1. Brython2. Pyjs3. WinPython4. Skulpt5. Shed Skin6. Active Python7. Transcrypt8. Nutika9. Jython10. CPython11. IronPython结论原文链接 Python是一门初学者的编程语言。它是一种高级语言,非常灵活、解释性和面向对象的语言。…...

如何安装、部署、启动Jenkins
一、测试环境 Linux系统 Centos 7 二、安装步骤: 1、安装jdk 我安装的是jdk8,此处就不多说了,自己百度哈,很简单 2、安装jenkins 首先依次执行如下三个命令: 2.1、导入镜像: [rootcentos7 ~]# sudo …...
sqlalchemy flask长时间未使用 导致数据库连接失效
临时解决方案:在正式运行定时任务之前,先跑一个session.query(),相当于唤醒连接。 参考 https://blog.csdn.net/sinat_42483341/article/details/103723691...
Ubuntu 20.04 系统或图像界面卡死或完全无响应处理方法
Ubuntu 20.04 系统或图像界面卡死或完全无响应处理方法 问题背景无需重启方法安全重启方法 问题背景 Ubuntu 20.04在安装驱动程序时系统突然无响应,终端也无法运行;考虑到尽量不破坏系统,不希望强制上下电重启机器,以免损坏文件系…...

Linux编辑器 - vim使用
1.vim的基本概念 Vim是一个广泛使用的文本编辑器,它是在Unix和Linux系统中常用的命令行文本编辑器之一。 vim的主要三种模式 ( 其实有好多模式,目前掌握这 3 种即可 ), 分别是 命令模式 ( command mode )、 插入模式 ࿰…...
【Windows】磁盘快捷修复
【Windows】磁盘快捷修复 1、背景2、关于Chkdsk3、示例 1、背景 前段时间使用U盘拷贝文件过程中,突然发现U盘无法读取了,U盘里面存储的数据也无法获取。 然后使用windows系统的chkdsk命令进行修复。 chkdsk全称:checkdisk,即磁盘…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...