当前位置: 首页 > news >正文

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&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;广泛用于前后端数据传输和存储。在C语言中&#xff0c;我们可以使用cjson库来处理JSON数据。本问总结了在使用cjson库中各个常用API的用法&#xff0c;包括组装JSON&#x…...

Shell脚本学习-case语句开发rsync服务的脚本

利用case语句开发类似系统启动rsync启动服务的脚本。&#xff08;可以参考系统rpcbind、nfs的脚本&#xff09;。 例如&#xff1a; /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将输入内容输出到屏幕和文件

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;本文已收录于专栏&#xff1a;Linux命令大全。 &#x1f3c6;本专栏我们会通过具体的系统的命令讲解加上鲜…...

使用Vue+CSS实现汉堡图标过渡为叉号图标,有点意思

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

python面试题【题目+答案】

最近遇到了一份python的面试题&#xff0c;题目比较简单&#xff0c;时间控制在一个小时之内。以下是面试的题目跟答案&#xff0c;答案不代表最优解&#xff0c;只是当时所想到的一些思路&#xff0c;接下来将分享给大家。 目录 1. 给出下面打印结果 2.字典如何删除键、如何…...

Rocky(centos) jar 注册成服务,能开机自启动

概述 涉及&#xff1a;1&#xff09;sh 无法直接运行java命令&#xff0c;可以软连&#xff0c;此处是直接路径 2&#xff09;sh脚本报一堆空格换行错误&#xff1a;需将转成unix标准格式&#xff1b; #切换到上传的脚本路径 dos2unix 脚本文件名.sh 2&#xff09;SELINUX …...

科大讯飞-鸟类分类挑战赛-测试【1】

科大讯飞-鸟类分类挑战赛-测试【1】 1. 比赛说明2. EfficientNet测试2.1 **模型搭建:**2.2 **模型训练:**2.3 训练过程可视化2.4 一些报错解决:1. 比赛说明 背景: 随着生态环境的不断变化和人类对自然资源的过度开发,世界各地的鸟类数量和种类正在发生着巨大的变化。为了更…...

两行CSS让页面提升渲染性能

content-visibility是CSS新增的属性&#xff0c;主要用来提高页面渲染性能&#xff0c;它可以控制一个元素是否渲染其内容&#xff0c;并且允许浏览器跳过这些元素的布局与渲染。 content-visibility: hidden的效果与display: none类似其区别在于&#xff1a; content-visibi…...

UniApp中tabbar设置了position: fixed以及bottom:0后出现一条缝隙,看到了后面的内容

问题描述 解决方法 直接将bottom设置成-2px即可...

设计模式行为型——责任链模式

目录 什么是责任链模式 责任链模式的实现 责任链模式角色 责任链模式类图 责任链模式举例 责任链模式代码实现 责任链模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;又叫职…...

Xamarin.Android中Intent的使用

目录 1、说明2、使用方法2.1 常用方法2.2 调用系统应用 3、参考资料 1、说明 在Android开发中常常会用到Intent进行不同活动启动&#xff0c;整理资料如下 2、使用方法 2.1 常用方法 1、一般情况而言&#xff0c;都是使用如下的方式进行调用 Intent intent new Intent(th…...

matplotlib绘制方波圆周分解动画

1 方波的圆周分解 在学习傅里叶变换的时候&#xff0c;有一个经典的示例是方波的分解。我们知道&#xff0c;方波可以分解为无数个正弦波的叠加。而正弦波&#xff0c;又可以看作是圆周运动在一条直线上的投影。当时为了理解这个事情&#xff0c;恐怕大家也花了不少时间。 学…...

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&#xff1a;200&#xff0c; 2&…...

【Python】5分钟了解11个最佳的Python编译器和解释器

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

如何安装、部署、启动Jenkins

一、测试环境 Linux系统 Centos 7 二、安装步骤&#xff1a; 1、安装jdk 我安装的是jdk8&#xff0c;此处就不多说了&#xff0c;自己百度哈&#xff0c;很简单 2、安装jenkins 首先依次执行如下三个命令&#xff1a; 2.1、导入镜像&#xff1a; [rootcentos7 ~]# sudo …...

sqlalchemy flask长时间未使用 导致数据库连接失效

临时解决方案&#xff1a;在正式运行定时任务之前&#xff0c;先跑一个session.query()&#xff0c;相当于唤醒连接。 参考 https://blog.csdn.net/sinat_42483341/article/details/103723691...

Ubuntu 20.04 系统或图像界面卡死或完全无响应处理方法

Ubuntu 20.04 系统或图像界面卡死或完全无响应处理方法 问题背景无需重启方法安全重启方法 问题背景 Ubuntu 20.04在安装驱动程序时系统突然无响应&#xff0c;终端也无法运行&#xff1b;考虑到尽量不破坏系统&#xff0c;不希望强制上下电重启机器&#xff0c;以免损坏文件系…...

Linux编辑器 - vim使用

1.vim的基本概念 Vim是一个广泛使用的文本编辑器&#xff0c;它是在Unix和Linux系统中常用的命令行文本编辑器之一。 vim的主要三种模式 ( 其实有好多模式&#xff0c;目前掌握这 3 种即可 ), 分别是 命令模式 &#xff08; command mode &#xff09;、 插入模式 &#xff0…...

【Windows】磁盘快捷修复

【Windows】磁盘快捷修复 1、背景2、关于Chkdsk3、示例 1、背景 前段时间使用U盘拷贝文件过程中&#xff0c;突然发现U盘无法读取了&#xff0c;U盘里面存储的数据也无法获取。 然后使用windows系统的chkdsk命令进行修复。 chkdsk全称&#xff1a;checkdisk&#xff0c;即磁盘…...

KubeSphere vs Kuboard:Kubernetes管理工具选型与实战对比

KubeSphere vs Kuboard&#xff1a;深度对比与选型指南 1. 开篇&#xff1a;为什么需要Kubernetes管理工具&#xff1f; 在云原生技术蓬勃发展的今天&#xff0c;Kubernetes已成为容器编排领域的事实标准。然而&#xff0c;原生Kubernetes Dashboard的功能相对基础&#xff0c;…...

快速搭建视觉定位服务:Chord(Qwen2.5-VL)一键部署与使用

快速搭建视觉定位服务&#xff1a;Chord&#xff08;Qwen2.5-VL&#xff09;一键部署与使用 1. 项目概述 Chord是基于Qwen2.5-VL多模态大模型的视觉定位服务&#xff0c;能够通过自然语言描述在图像中精确定位目标对象。想象一下&#xff0c;你只需要说"找到图里的白色花…...

个人创作者利器:AI净界RMBG-1.4,3秒完成以往30分钟的手动精修

个人创作者利器&#xff1a;AI净界RMBG-1.4&#xff0c;3秒完成以往30分钟的手动精修 1. 为什么你需要AI净界RMBG-1.4&#xff1f; 作为一名内容创作者&#xff0c;你是否经常遇到这些困扰&#xff1a; 拍摄的产品照片背景杂乱&#xff0c;需要花费大量时间手动抠图精心设计…...

零代码!用Qwen-Image-2512-ComfyUI轻松制作中文电商配图与营销素材

零代码&#xff01;用Qwen-Image-2512-ComfyUI轻松制作中文电商配图与营销素材 1. 为什么选择Qwen-Image-2512-ComfyUI 电商运营和内容创作者经常面临一个共同难题&#xff1a;如何快速制作高质量的中文营销素材。传统设计工具需要专业技能&#xff0c;而普通AI绘画工具又难以…...

HY-Motion 1.0作品集展示:12类日常动作+8类专业运动生成效果

HY-Motion 1.0作品集展示&#xff1a;12类日常动作8类专业运动生成效果 1. 引言&#xff1a;当文字能驱动骨骼 想象一下&#xff0c;你正在为一个游戏角色设计一套连贯的格斗动作&#xff0c;或者为一个虚拟主播编排一段自然的舞蹈。传统流程需要动画师一帧一帧地调整骨骼&am…...

OpenClaw小龙虾初体验【安装学习】

文章目录一、前言二、安装三、360安全龙虾四、腾讯龙虾4.1 文件移动4.2 应用分析4.3 Docker失败原因一、前言 最近小龙虾很火&#xff0c;不禁能说还能做&#xff0c;本质就类似木马&#xff0c;获取电脑权限&#xff0c;不禁能操作各应用还能联动外接设备。 那肯定要学习一下…...

基于GA - XGBoost的时间序列预测:抑制过拟合与参数优化

基于遗传算法优化算法优化XGBoost(GA-XGBoost)的时间序列预测 GA-XGBoost时间序列 采用交叉验证抑制过拟合问题 优化参数为迭代次数、最大深度和学习率 matlab代码&#xff0c;注&#xff1a;暂无Matlab版本要求 -- 推荐 2016B 版本及以上 注&#xff1a;采用 XGBoost 工具箱&a…...

Mojo调用PyTorch模型推理却遭遇内存泄漏?——国家级实验室验证的4层内存隔离架构首次公开

第一章&#xff1a;Mojo调用PyTorch模型推理却遭遇内存泄漏&#xff1f;——国家级实验室验证的4层内存隔离架构首次公开在高性能AI边缘部署场景中&#xff0c;Mojo语言通过其零开销FFI机制调用PyTorch C前端&#xff08;LibTorch&#xff09;实现低延迟推理&#xff0c;但实测…...

STM32与LoRa实现高压线缆智能监控方案

1. 项目概述高压线缆间隔棒监控装置是一个典型的工业物联网应用案例&#xff0c;它完美展现了如何将嵌入式系统与无线通信技术结合解决传统行业的痛点问题。作为一名在电力监控领域工作多年的工程师&#xff0c;我深知人工巡检高压线路的种种不便——不仅效率低下&#xff0c;而…...

嵌入式编程规范:提升代码质量与团队协作效率

1. 嵌入式编程规范的重要性作为一名在嵌入式领域摸爬滚打多年的工程师&#xff0c;我深刻体会到代码规范的重要性。记得刚入行时接手过一个老项目&#xff0c;里面混杂着五种不同的命名风格和三套缩进规则&#xff0c;光是理清代码逻辑就花了两周时间。从那以后&#xff0c;我就…...