CJSON 创建含多层嵌套结构体及结构体解析

C#解析JSON string jsonText = "{\"name\":\"网站\",\"num\":2,\"sites\":[{\"name\":\"Google\",\"info\":[\"Android\",\"Google搜索\",\"Google翻译\"]},{\"name\":\"Taobao\",\"info\":[\"淘宝\",\"网购\"]}]}";string jsonText = "{\"allname\":{\"name\":\"张三\",\"name_en\":\"zhangsan\"}}"; 阅读详情
AI摘要

本文详细介绍了在CJSON库中如何将C语言结构体转换为JSON格式,并解析JSON数据中包含的结构体数组和多层嵌套结构体。通过具体代码示例,展示了创建、读取和释放JSON对象的方法。

在CJSON的开发中,对于新手来说遇到的问题一般是或许如下几个:

第一、如何将C结构体转为一个Json数据格式的结构体?

第二、如果遇到Json数据格式中含有结构体数组怎么解析?

第三、如果遇到多层结构体嵌套又怎么解析?

如下图示,为多层结构体嵌套以及内含一个结构体数组:

                                               

以上问题也是我在进行JSON开发时所遇到的问题,经过学习及实验,最后才将CJSON的应用熟练,以下是代码的整理,对于多层结构体嵌套,嵌套的结构体数组如何添加和解析等的使用方法,在此记录只为供交流学习、复习及日后参考。

注意:在创建对象的时候要释放创建出来的对象空间,如果内嵌多个对象,只需要delete最顶层的root就行了。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <math.h>
#include "cJSON.h"

struct stGetOnePic{
	int LibIndex;
	int FlieIndex;
	char Pic[16];
};

struct stTestArray{
	int justTest0;
	char justTest1[16];
};

struct stInfo{
	char Name[8];
	char UUID[16];
	int TimeStamp;
	char Sign[16];
	int Mode;
	char Action[16];
	struct stGetOnePic GetOnePic;
	struct stTestArray TestArray[5];
};


int main()
{
	int i =0;
	//鐢熸垚Json鏁版嵁鏍煎紡
	cJSON*response_root = cJSON_CreateObject();
	cJSON_AddStringToObject(response_root, "Name", "123");
	cJSON_AddStringToObject(response_root, "UUID", "1234");
	cJSON_AddNumberToObject(response_root, "TimeStamp", 252);
	cJSON_AddStringToObject(response_root, "Sign", "12365");
	cJSON_AddNumberToObject(response_root, "Mode", 3);
	cJSON_AddStringToObject(response_root, "Action", "12396");
	
	cJSON*getonepic_root = cJSON_CreateObject();
	cJSON_AddNumberToObject(getonepic_root, "LibIndex", 9);	
	cJSON_AddNumberToObject(getonepic_root, "FlieIndex", 5);
	cJSON_AddStringToObject(getonepic_root, "Pic", "1236");
	cJSON_AddItemToObject(response_root, "GetOnePic", getonepic_root);

	cJSON*array=cJSON_CreateArray();
	cJSON_AddItemToObject(response_root,"TestArray",array);
	for(i=0;i<5;i++)
	{
		cJSON*obj=cJSON_CreateObject();
		cJSON_AddItemToArray(array,obj);
		if(i%2 == 0) cJSON_AddNumberToObject(obj, "justTest0", i);
		else cJSON_AddStringToObject(obj, "justTest1", "12365");
	}
	char *response_str = cJSON_Print(response_root);
	printf("%s\n",response_str);


	cJSON *pRcvJson = cJSON_Parse(response_str);
	if(NULL == pRcvJson){
		printf("%s cJSON_Parse failed, line =%ld\n",__FUNCTION__, __LINE__);
		return -1;
	}

	cJSON *item=cJSON_GetObjectItem(pRcvJson,"Name");
	if(item!=NULL) printf("Name:%s\n",item->valuestring);
	item=cJSON_GetObjectItem(pRcvJson,"UUID");
	if(item!=NULL) printf("UUID:%s\n",item->valuestring);
	item=cJSON_GetObjectItem(pRcvJson,"TimeStamp");
	if(item!=NULL) printf("TimeStamp:%u\n",item->valueint);
	item=cJSON_GetObjectItem(pRcvJson,"Sign");
	if(item!=NULL) printf("Sign:%s\n",item->valuestring);
	item=cJSON_GetObjectItem(pRcvJson,"Mode");
	if(item!=NULL) printf("Mode:%d\n",item->valueint);
	item=cJSON_GetObjectItem(pRcvJson,"Action");
	if(item!=NULL) printf("Action:%s\n",item->valuestring);
	cJSON* psecond = cJSON_GetObjectItem(pRcvJson,"GetOnePic");
	if(psecond!=NULL)
	{
		item=cJSON_GetObjectItem(psecond,"LibIndex");
		if(item!=NULL) printf("LibIndex:%d\n",item->valueint);
		item=cJSON_GetObjectItem(psecond,"FlieIndex");
		if(item!=NULL) printf("FlieIndex:%d\n",item->valueint);
		item=cJSON_GetObjectItem(psecond,"Pic");
		if(item!=NULL) printf("Pic:%s\n",item->valuestring);
	}

	cJSON *arrayread=cJSON_GetObjectItem(pRcvJson,"TestArray");
	if(arrayread !=NULL)
	{
		int arraysize=cJSON_GetArraySize(arrayread);
		printf("TestArray:\n");
		for(i=0;i<arraysize;i++)
		{
			item=cJSON_GetArrayItem(arrayread,i);
			if(item != NULL)
			{
				cJSON *itemread=cJSON_GetObjectItem(item,"justTest0");
				if(itemread != NULL) printf("justTest0:%d\n",itemread->valueint);
				itemread=cJSON_GetObjectItem(item,"justTest1");
				if(itemread != NULL) printf("justTest1:%s\n",itemread->valuestring);
			}
		}
	}
	if(response_root!=NULL) cJSON_Delete(response_root); //在这里释放最顶层的就好
	if(pRcvJson !=NULL) cJSON_Delete(pRcvJson);
	free(response_str);

	return 0;
}


 

 

使用CJson编写多个节点嵌套的程序代码 CJson(或者更常见的名称可能是cJSON,一个流行的C语言JSON解析库)允许你以程序化的方式处理JSON数据,包括创建、解析、修改和删除JSON对象。这里我将展示如何使用cJSON库来创建一个包含多个嵌套节点的JSON对象。如果你使用的是像Ubuntu这样的Linux发行版,可以通过包管理器安装它。替换为实际的cJSON头文件路径,这取决于你的安装方式和项目配置。的JSON对象,并向其中添加了一个简单的字符串类型的键值对。类似地,它创建了一个包含两个字符串元素的数组。接着,它创建了一个嵌套的对象。 阅读详情

相关推荐

C语言:使用cJSON库构造JSON

一、构造简单的JSON格式 1. 数字 cJSON库函数: //在对象中添加数字 CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number); 2. 字符串 cJSON库函数: //在对象中添加字符串 CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, cons

MQ0522的博客 3875

C·cJSON库函数--cJSON_GetObjectItem

首先使用cJSON_Parse函数将JSON字符串解析为cJSON节点树。然后使用cJSON_GetObjectItem函数获取该节点树中的某些值。需要注意的是,在获取"hobby"成员时,还需要使用cJSON_IsArray和cJSON_GetArraySize函数进行类型判断和数组大小获取。1、cJSON是一个轻量级的JSON解析库,cJSON_GetObjectItem函数是用来获取JSON对象中的某个成员的值。如果找到指定的成员,则返回该成员对应的cJSON节点,否则返回NULL。

m0_47102213的博客 1万+

Kali下RTL8812AU网卡5G抓包精准适配指南

WiFi监听模式是无线安全测试的基础能力,其核心在于网卡驱动对802.11a/n/ac协议栈的完整支持。RTL8812AU系列USB无线网卡因成本低、兼容性广被广泛用于渗透测试,但其芯片版本碎片化(如VA/VC/ACM)与Linux内核演进(6.1~6.5)存在严重适配断层,导致5GHz频段Beacon帧捕获失败、信道切换异常、注入功能残缺等典型问题。技术价值在于突破‘即插即用’幻觉,建立从USB设备ID识别、固件版本校验到射频寄存器级补丁的全链路可控流程。典型应用场景包括CTF无线赛题实战、红蓝对抗中的W

weixin_33783283的博客 762

cjson解析器说明

C++相关的cjson解析器说明及用法

scott198512的博客 3469

异步fifo的UVM验证(最终最终版)

更新了refmdl以及scb

qq_44674008的博客 2988

PX4从放弃到精通(三):使用qt编译PX4

1 下载px4源码 2在Firmware所在目录下执行 mkdir Firmware-build cd Firmware-build cmake …/Firmware -G “CodeBlocks - Unix Makefiles” -DCONFIG=nuttx_px4_fmu-v5_default 第三步最后的px4_fmu-v5_default根据自己的情况修改 执行完后如图 打开QT 点击打开工程 选择源码的CmakeLists.txt文件 选择imported Kit 打开项目那一栏,构建目

超维空间科技的博客 1万+

cjson提取嵌套对象-第6讲

json提取嵌套对象

LC的专栏 1424

2026.02.04 AI趋势|原生工作流爆发,智能体重构开发范式

2026年2月4日GitHub Trending榜单迎来关键转变——传统工具链项目占比骤降,AI原生工作流相关项目成为绝对主流。本次Top 20榜单中,超70%项目聚焦AI模型的四大核心能力:上下文增强、任务编排、自治执行、知识闭环。值得关注的是,Claude生态(如claude-mem)与OpenAIskills框架形成跨厂商协同,尽管设计理念有差异,但共同推动多模型智能体(Multi-Model Agent)成为新一代软件基础设施,AI开发正式从“单点调用”迈入“系统级编排”时代。

lpfasd123的博客 348

cJSON解析数组嵌套

cJSON解析数组嵌套 算是实现了,肯定有更好的方法,有欢迎探讨 #json实体如下 { "service":[ { "data1":[1,2,3]; "data1":[1,2,3]; } { "data1":[7,8,9]; "data1":[1,2,3]; } { "data1":[11,22,33]; "data1":[1,2,3]; } ] } #代码如下 #include <stdio.h> #include <s

weixin_44668503的博客 2271

Android CCodec (十七) 硬件解码调用分析-1(基于V4l2)

简单的分析V4L2DecodeComponent和其相关内容,后续针对解码调用单独分析。

给大佬递杯卡布奇诺的博客 6593

15、人工智能社会学:关系视角下的机器相遇

本文探讨了将人工智能视为社会主体的可能性,提出了一种关系视角下的人工智能社会学。通过结合卢西亚娜·帕里西、艾伦·图灵和乔治·赫伯特·米德的理论,强调不确定性在人工智能运行中的核心地位,并分析了人工智能如何通过与社会环境的互动催生新奇性,从而拓展社会学的研究范畴。文章还讨论了人工智能对社会结构和社会互动的影响,以及其作为社会主体所带来的理论和实践意义,为未来人工智能社会学的发展提供了方向。

pea55的博客 73

C语言库函数解析JSON文件

1、解析一个JSON格式的字符串, 生成cJson的结构体 cJSON *data = cJSON_Parse(); 1)根据键找json结点 /*Get item “string” from object*/ extern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string); 作用:获取JSON字符串字段值 返回值:成功返回...

qq_40674996的博客 2316

28、基于图像快速序列视觉呈现(RSVP)的脑机接口特征提取与分类算法综述

本文综述了基于图像快速序列视觉呈现(RSVP)的脑机接口(BCI)中的特征提取与分类算法。RSVP技术通过快速连续呈现图像序列,结合脑电图(EEG)信号分析,实现对目标图像的识别和标记。文章详细介绍了RSVP实验的设计、EEG数据的采集与预处理,并探讨了低信噪比、维度灾难、重叠epoch和不平衡数据集等挑战。针对特征提取,讨论了有监督空间滤波方法(如CSP、xDAWN、LDA波束形成器)的原理和应用。在分类策略部分,涵盖了线性分类技术(如LDA、BLR、LR、SVM)和非线性分类方法(如MLP、CNN)。文

hh234的博客 337

cJSON

cJSON_GetArrayItem(cJSON *array,int item)是获得array里面的Object,后面的参数是0.1.2…n,分别代表array里面的第一个到第n个Object。 cJSON_GetObjectItem(cJSON *object,const char *string)是获得Object里面的string,后面的参数是相当于是key,是一个string字符串。 参考 ...

xiaohuihui1994的博客 892

使用C/C++复制图像

要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。要使用上述代码,需要将输入图像和输出图像的文件名替换为实际的图像文件名。当程序执行完毕后,将会在当前目录下生成一个名为"output.jpg"的图像文件,其中包含与输入图像完全相同的图像数据。函数将输出图像保存到文件中。在这个示例中,我们假设输入图像是一个常见的JPEG图像,文件名为"input.jpg"。

CyberWarpX的博客 729

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

cJSON 多层json

{ "Name": "123", "UUID": "1234", "TimeStamp": 252, "Sign": "12365", "Mode": 3, "Action": "12396", "GetOnePic": { "LibIndex": 9, "Fli...

qq_30754685的博客 1145

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

使用cJSON解析JSON字符串

使用cJSON解析JSON字符串 一、为何选择cJSON; 二、cJSON的核心结构体; 三、解析JSON格式; 1,下载源码; 2,包含cJSON的源码; 3,解析一个键值对; 4,解析一个结构体; 5,解析结构体数组的JSON串; 附带例程;

lintax的专栏 8万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【转载】cJSON使用详细教程 | 一个轻量级C语言JSON解析器

版权声明:本文为优快云博主「Mculover666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.youkuaiyun.com/Mculover666/article/details/103796256。

eudemonicli的博客 1852

【嵌入式开源库】cJSON的使用,高效精简的json解析库

JSON 全称 JavaScript Object Notation,即 JS对象简谱,是一种轻量级的数据格式。它采用完全独立于编程语言的文本格式来存储和表示数据,语法简洁、层次结构清晰,易于人阅读和编写,同时也易于机器解析和生成,有效的提升了网络传输效率。cJSON是一个使用C语言编写的JSON数据解析器并采用ANSI C(C89)编写以支持尽可能多的平台和编译器,该项目同时也具有超轻便,可移植,单文件的特点,使用MIT开源协议。json格式{虚拟机ubuntu1804。......

凉开水白菜的博客 2189

聊聊多层嵌套的json的值如何解析/替换

前阵子承接了2个需求,一个数据脱敏,一个是低代码国际化多语言需求,这两个需求有个共同特点,都是以json形式返回给前端,而且都存在多层嵌套,其中数据脱敏的数据格式是比较固定,而低代码json的格式存在结构固定和不固定 2种格式。最后不管是数据脱敏或者是多语言,业务抽象后,都存在需要做json值替换的需求。今天就来聊下多层嵌套json值如何解析或者替换本文的多层嵌套json的解析和替换都提供了几种方案,综合来讲是推荐将json先转对象,通过对象操作。对json替换,推荐使用自定义json序列化注解的方式。

kingwinstar的博客 3975

cjson cJSON_GetObjectItem卡死

p =cJSON_GetObjectItem(ptJson, "card")->valueString; cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) { cJSON *c=object->child; //BAS_LOG(BAS_LOGDEBUG, 0, 0, "begin"); while (c && cJSON_strcasecmp(c->string,string

weixin_32722775的博客 1865

cjson嵌套

创建解析return 1;return 2;return 3;return 4;return 5;return 6;return 7;return 8;return 0;主函数int main()return 0;结果:

大话嵌入式 1324

C语言:解析cjson详解释

1.下载cJSON库文件cJSON库文件一共两个文件:cJSON.h和cJSON.c。下载地址2.语法数据在名称/值对中,key : valueJSON key 必须是字符串数据由逗号分隔大括号 {} 保存对象中括号 [] 保存数组,数组可以包含多个对象3.JSON value 值JSON 值可以是:字符串, 数字, 对象, 数组, 布尔值或 null数字(整数或浮点数)JSON 数字可以是整型或者浮点型:字符串(在双引号中)逻辑值(true 或 false)

x623879294的博客 7294

利用cJSON解析JSON格式

利用cJSON解析JSON格式,附案例

pjwshuai的博客 1万+

【嵌入式开源库:cJSON】 一个轻量级C语言JSON数据解析库用法详解

cJSON是使用C语言编写,用来创建、解析JSON文件的库。cJSON特点就是工程文件简单,只有一个.c和一个.h,但提供函数接口功能齐全,麻雀虽小五脏俱全,使得在嵌入式工程中使用起来得心应手。

徐腾腾的博客 3568

c语言json结构体_C语言创建Json的使用法则

参考原文:http://blog.youkuaiyun.com/xukai871105/article/details/33013455JSON(JavaScriptObject Notation)是一种轻量级的数据交换格式。它基于JavaScript的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器...

weixin_42157556的博客 816
上一篇: gdb移植arm,编译错误对‘_obstack_free’未定义的引用
下一篇: Linux GPIO驱动实例及GPIOLib简介
Chasing_Chasing
博客等级 码龄10年 233粉丝 87原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值