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

这篇具有很好参考价值的文章主要介绍了【嵌入式开源库:cJSON】 一个轻量级C语言JSON数据解析库用法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

cJSON简介

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

cJSON获取

https://github.com/DaveGamble/cJSON
只需拉取cJSON.ccJSON.h即可。

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

cJSON解析

给出如下JSON格式示例

{
	 "messageType": 2,
	 "messageId": "16493268950279230864908057508987",
	 "imei": "864908057508987898607B1192180035422",
	 "iccid": "898607B1192180035422",
	 "reportTime": "2022-12-16 15:49:00",
 	 "gpsData":
 	 [
 	 		{
 	 			"Longitude":31.23453232,
 	 			"Latitude":118.45345431
			},
			{
				"Longitude":31.23453245,
 	 			"Latitude":118.45345443
			}
			{
				"Longitude":31.23453255,
 	 			"Latitude":118.45345453
			}
   	  ]
}

1、先创建根节点指针

cJSON *root = NULL;
root = cJSON_Parse(msg);

cJSON其实是个结构体类型,被定义如下,cJSON_Parse接口拿到我们的msg数据后会创建一个cJSON结构实例,我们创建的cJSON结构体指针root,会指向这个cJSON结构体实例。既然是实例,就会申请内存。所以最后我们一定要释放掉这块内存,否则将导致内存泄漏

/* The cJSON structure: */
typedef struct cJSON
{
    /* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
    struct cJSON *next;
    struct cJSON *prev;
    /* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
    struct cJSON *child;

    /* The type of the item, as above. */
    int type;

    /* The item's string, if type==cJSON_String  and type == cJSON_Raw */
    char *valuestring;
    /* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
    int valueint;
    /* The item's number, if type==cJSON_Number */
    double valuedouble;

    /* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
    char *string;
} cJSON;

cJSON结构体其实是一个抽象的键值对。
他通过成员:前节点、后节点、子节点,来实现JSON结构的嵌套,JSON结构最终在内存中是以一个链表的形式存在。

struct cJSON *next; //前节点
struct cJSON *prev; //后节点
struct cJSON *child;//子节点

而每个节点通过以下成员存储键值

char *valuestring;
int valueint;
double valuedouble;

2、获取键值对

是int类型键值就指向valueint,是字符串类型指向valuestring,字符串数据我们可以用strcpy拷贝出来

cJSON *msgType = NULL;
msgType = cJSON_GetObjectItem(root , "messageType" );
int type = msgType ->valueint

char id[21];
cJSON *iccid = NULL;
iccid = cJSON_GetObjectItem(root , "iccid" );
strcpy(id, iccid ->valuestring);

3、获取数组

如果出现像示例中gpsData这种JSON数组,数组下面又嵌套着新的JSON数据的,我们将使用以下API

cJSON* gpsDataArray = NULL;
cJSON* gpsPoint = NULL;
int gpsArraySize = 0;
double Longitude = 0//经度
double Latitude = 0 //纬度

gpsDataArray = cJSON_GetObjectItem(root, "gpsData");
gpsArraySize = cJSON_GetArraySize(gpsDataArray);
for(i = 0; i < gpsArraySize ; i++)
{
    gpsPoint = cJSON_GetArrayItem(gpsDataArray , i);
    
    Longitude = cJSON_GetObjectItem(gpsPoint , "Longitude");
    Latitude = cJSON_GetObjectItem(gpsPoint , "Latitude");
}

4、释放内存 !

cJSON_Delete(root);

cJSON组装

现在我们试图组装《cJSON解析》中的示例

1、同样,创建根节点

 cJSON* root = NULL;
 root = cJSON_CreateObject();

2、添加键值对成员

cJSON_AddNumberToObject(root , "messageType", 2);

cJSON_AddStringToObject(root , "messageId", "16493268950279230864908057508987");
cJSON_AddStringToObject(root , "imei", 		"864908057508987898607B1192180035422");
cJSON_AddStringToObject(root , "iccid", 	"898607B1192180035422");
cJSON_AddStringToObject(root , "reportTime","2022-12-16 15:49:00");

3、添加数组

和解析相反,我们应该先创建gps点,然后把点添加到数组,再把数组添加到根节点

	//先创建3个gps点
    cJSON* gpsData1 = NULL;
    gpsData2 = cJSON_CreateObject();
    cJSON_AddNumberToObject(gpsData1 ,"Longitude", 31.23453232);
    cJSON_AddNumberToObject(gpsData1 ,"Latitude",  118.45345431;
    cJSON* gpsData2 = NULL;
    gpsData2 = cJSON_CreateObject();
    cJSON_AddNumberToObject(gpsData2 ,"Longitude", 31.23453245);
    cJSON_AddNumberToObject(gpsData2 ,"Latitude",  118.45345443;
    cJSON* gpsData3 = NULL;
    gpsData3 = cJSON_CreateObject();
    cJSON_AddNumberToObject(gpsData3 ,"Longitude", 31.23453255);
    cJSON_AddNumberToObject(gpsData3 ,"Latitude",  118.45345453;

    
	//创建数组,把gps点添加到gps数组
	cJSON* gpsArray = NULL;
    gpsArray = cJSON_CreateArray();
    cJSON_AddItemToArray(gpsArray ,gpsData1 );
    cJSON_AddItemToArray(gpsArray ,gpsData2 );
    cJSON_AddItemToArray(gpsArray ,gpsData3 );

	//把gps数组添加到根节点
	cJSON_AddItemToObject(root,"gpsData",gpsArray );

4、输出组装的JSON

char *msg;
msg =  cJSON_Print(root)

5、依然要记得释放内存文章来源地址https://www.toymoban.com/news/detail-425425.html

cJSON_Delete(root);

到了这里,关于【嵌入式开源库:cJSON】 一个轻量级C语言JSON数据解析库用法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 带你了解LVGL:一个开源的嵌入式图形库

    嵌入式系统是一种将计算机硬件和软件集成在一个特定的应用中的系统,例如智能手机、智能手表、汽车仪表盘等。嵌入式系统通常需要与用户进行交互,因此需要一个友好和易用的图形用户界面(GUI)。然而,开发一个高质量的GUI并不容易,因为嵌入式系统通常有限的资源

    2024年02月09日
    浏览(64)
  • 嵌入式学习:开源与闭源

    开源指的是那些源代码或源设计可以被大众使用、修改发行的软件或设计体,闭源就是不开放源代码。 Linux 无疑是开源软件里最最成功的一个,不管是从它目前的生态建设角度,还是从业界评价来看,包括今天云计算的基础也都倚赖Linux的贡献和基石。当然,像OpenStack、Ha

    2024年02月08日
    浏览(48)
  • Qt优秀开源项目之二十一:遇见QSkinny,一个轻量级Qt UI库

    目录 一.QSkinny简介 二.工作原理 三.编译 QSkinny库基于Qt Graphic View和Qt/Quick中少量的核心类。它提供了一组轻量级控件,可以在C++或QML中使用这些控件。QSkinny默认是启用硬件加速的,非常适合嵌入式设备,目前已经应用于大量汽车GUI的代码实现中。正如预期的那样,它有良好的

    2024年01月23日
    浏览(63)
  • 嵌入式相关开源项目、库、资料------持续更新中

    学习初期最难找的就是找学习资料了,本贴精心汇总了一些嵌入式相关资源,包括但不限于编程语言、单片机、开源项目、物联网、操作系统、Linux、计算机等资源,并且在不断地更新中,致力于打造全网最全的嵌入式资料库。有好的嵌入式相关资源的朋友欢迎做贡献,利人

    2024年02月02日
    浏览(46)
  • 分享一款嵌入式开源按键框架代码工程MultiButton

    MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块。 Github地址:https://github.com/0x1abin/MultiButton 这个项目非常精简,只有两个文件: (1)可无限扩展按键; (2)按键事件的回调异步处理方式可以简化程序结构,去除冗余的按键处理硬编码,让按键业务逻辑更清晰。 通

    2024年04月15日
    浏览(68)
  • 嵌入式Qt 第一个Qt项目

    打开Qt Creator 界面选择 New Project或者选择菜单栏 【文件】-【新建文件或项目】菜单项   弹出New Project对话框,选择Qt Widgets Application 选择【Choose】按钮,弹出如下对话框 设置项目名称和路径,按照向导进行下一步   选择编译套件 向导会默认添加一个继承自QMainWindow的类,可

    2024年02月20日
    浏览(48)
  • 【嵌入式】使用MultiButton开源库驱动按键并控制多级界面切换

    目录 一 背景说明 二 参考资料 三 MultiButton开源库移植 四 设计实现--驱动按键 五 设计实现--界面处理         需要做一个 通过不同按键控制多级界面切换以及界面动作 的程序。         查阅相关资料,发现网上大多数的应用都比较繁琐,且对于多级界面的切换逻辑可读

    2024年02月07日
    浏览(60)
  • 嵌入式系统(embedded systems)-配置文件解析-开源库minIni

    minIni开源库的介绍 minIni是一个用于在嵌入式系统中读写“INI”文件的程序库。minIni占用很少的资源,具有确定的内存占用,并且可以为各种类型的文件I/O库配置。 gitee 链接:link https://gitee.com/resetlove/minIni github 链接:link https://github.com/compuphase/minIni.git minlni是一个可移植和可配置

    2024年02月03日
    浏览(49)
  • 嵌入式Qt 开发一个音乐播放器

    上篇文章:RK3568源码编译与交叉编译环境搭建,进行了OK3568开发板软件开发环境搭建,通过编译RK3568的源码,可以得到Qt开发的交叉编译相关工具。 本篇,就来在搭建好的软件开发中,进行Qt软件的开发测试。由于Qt是支持跨平台的,因此本篇的音乐播放器,先在Windows上编写

    2024年02月02日
    浏览(49)
  • 【嵌入式资讯】Arm 通过引入 Keil MDK 版本 6 将嵌入式软件开发提升到一个新的水平

            随着物联网设备变得越来越智能,开发人员面临着日益增加的软件复杂性,这需要新的开发流程来创建优化的 ML 模型和高效的设备驱动程序。因此,我们为生态系统提供的软件开发平台和工具必须与我们的处理器路线图一起发展。Keil 微控制器开发套件 (Keil M

    2024年02月15日
    浏览(98)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包