cJSON

article/2025/10/7 9:29:15

优点:cJSON只有cJSON.h和cJSON.c两个文件、600行代码可以直接加到工程项目中,不必编译成库使用。

结论:优先使用cJSON


cJSON结构:

/* The cJSON structure: */
typedef struct cJSON {struct cJSON *next,*prev;	/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */struct cJSON *child;		/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */int type;					/* The type of the item, as above. */char *valuestring;			/* The item's string, if type==cJSON_String */int valueint;				/* The item's number, if type==cJSON_Number */double valuedouble;			/* The item's number, if type==cJSON_Number */char *string;				/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
} cJSON;


使用过程:


1.创建

        cJSON *cjson = cJSON_CreateObject();   //创建一个对象节点cJSON *cjson = cJSON_CreateArrary();    //创建一个数组cJSON *cjson = cJSON_CreateString(const char *ch);    //创建一个字符串类型的节点,保存chcJSON *cjson = cJSON_CreateNumber(double n);    //创建一个数字类型的节点,保存n,不分整数和浮点数...

        cJSON_CreateXXX内部使用malloc分配动态内存,使用完后一定调用

        cJSON_Delete(cjson);


2.解析

        char *ch = "{\"name\":\"rongxiaojun\", \"object\":[\"xys\", \"hdm\", \"qinxiaohui, my friend\", \"songtao, laji\"]}";cJSON *cjson = cJSON_Parse(ch);

   温馨提示

        a.若字符串格式不符合规范,cJSON_Parse返回0

        b.使用完后使用cJSON_Delete(cjson)进行空间释放


3.输出

        char* ch = cJSON_Print(cJSON *cjson);

       内部用malloc为ch分配了空间,所以使用完后需free(ch)


4.取节点

   4.1对象节点

        //取cjson中名字为"name"的子节点,故cj->string = "name"cJSON *cj = cJSON_GetObjectItem(cjson, "name");

    4.2数组节点

        //从cjson数组取第n个元素(数组元素也为节点)cJSON *cj = cJSON_GetArrayItem(cjson, n);

    温馨提示:字段不存在均返回0


5.取值

	char *ch = cjson->valuestring;int n = cjson->valueint;double d = cjson->valuedouble; 

6.取节点名字

        char *ch = cj->string;

        注意:取名操作通常用于子节点,因为顶级节点没名所以对顶级节点取名会出错


7.添加节点

    7.1 添加普通对象节点

        cJSON_AddStringToObject(cjson, "name", "rongxiaojun");cJSON_AddNumberToObject(cjson, "name", n);

    7.2 添加数组节点

        cJSON_AddItemToArray(cj, cJSON_CreateString("shilaji"));cJSON_AddItemToArray(cj, cJSON_CreateNumber(n));

    温馨提示:cJSON在添加数字时不区分整数和浮点数,该值被同时赋给cjson->valueint和cjson->valuedouble,用户根据需要取出对应值


8. 删除节点

    8.1 删除普通对象节点

        删除key为name的节点

cJSON_DeleteItemFromObject(cjson, "name");

    8.2 删除数组节点

        删除数组中第2个元素

cJSON_DeleteItemFromArray(cjson, 2);
    温馨提示:cJSON_DeleteItemFrom*函数在删除节点时内存即清理,故不存在内存泄露问题,可放心使用。


9.数组


9.1 取数组个数

        int num = cJSON_GetArraySize(cj);


9.2 取节点

/*从cjson数组取第n个元素(数组元素也为节点)*/        
cJSON *cj = cJSON_GetArrayItem(cjson, n);  
//不存在返回0

9.3 添加节点

cJSON_AddItemToArray(cj, cJSON_CreateString("shilaji"));
cJSON_AddItemToArray(cj, cJSON_CreateNumber(n));

示例

		cJSON *cjson = cJSON_CreateArray();cJSON_AddItemToArray(cjson, cJSON_CreateString("123456"));cJSON_AddItemToArray(cjson, cJSON_CreateString("nihaihaoma"));cJSON_AddItemToArray(cjson, cJSON_CreateString("jintianxingqiwule"));int iCnt = cJSON_GetArraySize(cjson);for(int i = 0; i != iCnt; ++i)printf("%s\n", cJSON_GetArrayItem(cjson, i)->valuestring);
结果



10.验证字段存在

        if(cJSON_GetObjectItem(cjson, str.c_str()) == NULL)return false;elsereturn true;

11.bool操作

        a.添加:cJSON_AddBoolToObject(cjson, "name", flag);

        b.读取:bool bRes = cJSON_GetObjectItem(cjson, "name")->type;


//从cjson数组取第n个元素(数组元素也为节点) cJSON *cj = cJSON_GetArrayItem(cjson, n);

http://chatgpt.dhexx.cn/article/7ytagOtu.shtml

相关文章

征稿丨IJCAI'23大模型论坛,优秀投稿推荐AI Open和JCST(CCF-B)发表

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 第一届LLMIJCAI23 Symposium征稿中,优秀投稿论文推荐《AI Open》(EI检索)和 《JCST》(CCF-B)发表。 大规模语言模型(LLMs),如ChatGPT和GPT…

JCS原理及使用

1.概要 JCS是Jakarta的项目Turbine的子项目,它是复合式的缓冲工具,具有配置灵活的特点。JCS提供内存、硬盘、分布式架构、构建缓存 服务器四种方式来实现对象缓存;能够很方便的实现缓存的差异化定制。有缓冲对象时间过期设定。对于一些需要频…

JTW

1.1.1.简介 JWT,全称是Json Web Token, 是JSON风格轻量级的授权和身份认证规范,可实现无状态、分布式的Web应用授权;官网:https://jwt.io 1.1.2.数据格式 JWT包含三部分数据: Header:头部&…

JST简介

从JSP 1.1规范开始,JSP就支持在JSP中使用自定义标签了,自定义标签的广泛使用造成了程序员重复定义,这样就促成了JSTL(JavaServer? Pages Standard Tag Library)的诞生。作者:丁令(http:///www.DingL.com/…

JTA和JTS

JTA,即Java Transaction API,JTA允许应用程序执行分布式事务处理–在两个或多个网络计算机资源上访问并且更新数据。JDBC驱动程序的JTA支持极大地增强了数据访问能力。JTA事务比JDBC事务更强大。一个JTA事务可以有多个参与者,而一个JDBC事务则被限定在一个单一的数据库连接。…

JCST(Journal of Computer Science and Technology)Latex模板问题小结

1. 带圈脚注 \def\jz#1#2{{$^{\footnotesize\textcircled{\tiny #1}}$\let\thefootnote\relax\footnotetext{\!\!$^{\footnotesize\textcircled{\tiny #1}}$#2}}}\jz{1}{Content of the footnote} 2. 参考文献上标 \renewcommand\upcite[1]{\textsuperscript{\cite{#1}}}\up…

征稿丨IJCAI‘23大模型论坛,优秀投稿推荐AI Open和JCST发表

第一届LLMIJCAI’23 Symposium征稿中,优秀投稿论文推荐《AI Open》和 《JCST》发表。 大规模语言模型(LLMs),如ChatGPT和GPT-4,以其在自然语言理解和生成方面的卓越能力,彻底改变了人工智能领域。 LLMs广泛…

计算机国内最好的期刊(国内三大) + JCST

计算机国内最好的期刊(国内三大) JCST (2012-05-08 15:10:12) ▼ 都是EI核心来源期刊; 中国计算机学会参与主办是会刊; 科学出版社出版发行; 可接受8000-10000字左右的长文; 稿量大,处理流程大…

国内计算机八大学报

国内计算机八大学报 计算机学报 软件学报 计算机科学与技术学报(JCST) 在知网里搜不到计算机科学与技术学报或JCST,应该是因为它是英文文献,所以没收录。 计算机研究与发展 自动化学报 电子学报 通信学报 中国科学 有的时…

微信小程序实现轮播图

实现轮播图之前必须知道以下三点: 一、轮播图外层容器swiper 二、每一个轮播项swiper-item 三、swiper标签存在默认样式 1. width 100% 2. height 默认为 150px 3 .swiper高度无法实现由内容撑开 默认的150px高度的轮播图如下图: 原图是长这个样子的&#xf…

微信小程序—连接MQTT

1、在微信开发小程序工具中首先安装mqtt.js与mqtt.min.js到文件utils中,并在引用的.js文件中声明。 var mqtt require(../../utils/mqtt.min.js)2、可以选择公共的MQTT服务器,仅用于测试,较为方便,由EMQ提供。同时可参考EMQ提供的…

微信小程序解密并拆包获取源码教程

第一步:电脑端提取微信小程序包 一般在微信安装目录下的,比如我微信安装在d盘当中,那么下载的wxapkg包就在下方 D:\qq\wechatfile\WeChat Files\Applet那么微信小程序加载的wxapkg包都在这里 比如下方的一个微信小程序的包就在这里 第二步:解密wxapkg包 工具下载地址 https:/…

最新微信小程序反编译破解过程记录

一、前言 既然你进来看这篇文章,我认为“微信小程序反编译”这个技术你多少应该会了解点。在学习微信小程序前端开发的过程中,我跟大部分人一样,试着仿写过一些线上的小程序案例,但在实际练手中,别人的小程序对你来说…

记一次逆向破解微信小程序参数签名

前言 在一个平淡无奇的午后,接到一个新的活——对某微信小程序进行渗透测试。老规矩,倒了杯茶,准备开始新一天轰轰烈烈的干活(摸鱼)。 然鹅,BurpSuite 上号不到 2 min 我就发现今天的砖头有点烫手了&…

Flowable多实例加签减签功能正式上线

文章的最下面有学习视频与源代码 拒绝重复造轮子了,有这个流程平台就够了 概念 什么是加签 在一个多实例会签流程中,会签节点审批人有A、B两个人。当A领导登录的时候,看到当前节点只有两个人,责任承担比较大。 然后我们就想把C…

flowable6.4 并行网关 驳回 跳转 回退 多实例加签减签

目录 前言flowable6.4.2 不足之处并行网关跳转驳回BUG多实例加签减签BUG 解决之法说明用法 前言 flowable 优秀的工作流流程引擎框架,前身Activity 为什么要用工作流? 主要是应对: 流程可能随时变更步骤处理人可能变更并行任务处理分支任务…

工作流后加签实现

1、流程重新定义 动态改变流程指向,创建新的节点 2、后加签环节及后加签属性设置 流程持久化、克隆活动、独立CMD 3、原始流程操作及后加签环节操作 4、流程场景遍历 5、流程图元体现 BPM后加签V1.0版说明。 效果图示: 功能说明: 1、…

前后端RSA互相加解密、加签验签、密钥对生成(Java)

目录 一、序言二、关于PKCS#1和PKCS#8格式密钥1、简介2、区别 二、关于JSEncrypt三、关于jsrsasign四、前端RSA加解密、加验签示例1、相关依赖2、cryptoUtils工具类封装3、测试用例 五、Java后端RSA加解密、加验签1、CryptoUtils工具类封装2、测试用例 六、前后端加解密、加验签…

国密:SM2公私钥加签验签

一、工具类 POM中增加hutool <dependency><groupId>cn.hutool</groupId><artifactId>hutool-core</artifactId><version>5.6.5</version></dependency> package cn.test.encrypt.utils.sm2; /*** SM2签名所计算的值 可以根据…

RSA加签解签方法

一、RSA签名的过程 &#xff08;1&#xff09;A生成一对密钥&#xff08;公钥和私钥&#xff09;&#xff0c;私钥不公开&#xff0c;A自己保留。公钥为公开的&#xff0c;任何人可以获取。 &#xff08;2&#xff09;A用自己的私钥对消息加签&#xff0c;形成签名&#xff0…