cJSON介绍与应用—基于VS以及STM32单片机

2023-11-17

一、cJSON介绍
cJSON是一个使用C语言编写的JSON数据解析器,具有超轻便,可移植,单文件的特点,使用MIT开源协议。
cJSON的源码文件只有两个:
1. cJSON.h
2. cJSON.c

使用的时候,只需要将这两个文件复制到工程目录,然后包含头文件cJSON.h即可
具体的介绍请看(https://blog.csdn.net/Mculover666/article/details/103796256),此博客对JSON与cJSON的介绍很详细,我的文章主要进行应用。
二、基于VS的应用
将cJSON.h与 cJSON.c添加到工程文件中,实现构建数据结构以及解析数据的功能,对于cJSON的应用,主要是使用cJSON构建自己的数据结构体,然后使用cJSON来进行解析到自己的数据,因此需要有两个函数:

/*********************************
@Function :创建数据结构
*********************************/
char* cJSON_Create_data(void)
/*********************************
@Function :解析数据
*********************************/
void Get_cJSON_data(char *message)

1、创建数据结构,将自己的数据构建数据结构,进行发送或存储

{
        "name": "mculover666",
        "age":  22,
        "number":       300,
        "weight":       55.500000,
        "address":      {
                "country":      "China",
                "zip-code":     111111
        },
        "skill":        ["C", "Java", "Python"],
        "student":      false
}

2、解析创建的数据结构,得到接收的数据

name: mculover666
age:22
number:300
weight:55.5
address-country:China
address-zipcode:111111
skill:[C,Java,Python]
student: false

3、应用工程
这个基于VS2012的工程可以直接下载使用,下载链接如下:
https://download.csdn.net/download/liujunping11/32672969
二、基于STM32的应用
基于STM32对于cJSON数据格式的应用有两种方式,一种是将cJSON.h与 cJSON.c添加到STM32的工程中,另一种是使用STM32自己的JSON库进行应用,以下回介绍两种方式。
STM32的cJSON的应用主要基于STM32将传感器检测到的数据发送到串口,然后设计上位机来解析串口的数据来进行演示,达到数据通信的应用形式。
1、将cJSON.h与 cJSON.c添加到STM32的工程
将cJSON.h与 cJSON.c添加到STM32的工程,跟上面类似,在STM32的工程里使用构建数据结构函数来构建发送的数据格式,在上位机中使用解析数据函数来解析数据结构得到自己接收的数据,具体如下:

  • 1.1

    STM32函数部分:构建数据结构,即{ “Lsens”:Data_cJSON(传感器数据)}

/*********************************
@Function :创建数据格式
*********************************/
char* cJSON_Create_data(u8 Data_cJSON)
{
    cJSON* cjson_test = NULL;
	
    char* str = NULL;

    /* 创建一个JSON数据对象(链表头结点) */
    cjson_test = cJSON_CreateObject();
   
	 /* 添加一条整数类型的JSON数据(添加一个链表节点) */
    cJSON_AddNumberToObject(cjson_test, "Lsens", Data_cJSON);

    /* 打印JSON对象(整条链表)的所有数据 */
    str = cJSON_Print(cjson_test);
    free(str);
    cJSON_Delete(cjson_test);
	return str;
}
  • 1.2
    上位机函数部分:上位机我使用QT写了一个串口小工具,使用数据解析函数来解析在STM32中构建的数据结构得到传感器数据,继而在QT的串口小工具中显示STM32数据,即解析{ “Lsens”:Data_cJSON(传感器数据)}中的Data_cJSON
/*********************************
@Function :解析数据格式
*********************************/
int Get_cJSON_data(char *message)
{
    cJSON* cjson_test = NULL;
    cJSON* cjson_Lsens = NULL;
    int data = 0;
    /* 解析整段JSO数据 */
    cjson_test = cJSON_Parse(message);
    if(cjson_test == NULL)
    {
        printf("parse fail.\n");
    }
    /* 依次根据名称提取JSON数据(键值对) */
    cjson_Lsens = cJSON_GetObjectItem(cjson_test, "Lsens");
    printf("Lsens:%d\n", cjson_Lsens->valueint);
    data = cjson_Lsens->valueint;
    return data;
}
  • 1.3
    上位机串口接收到的部分:如下图所示,其中{ “Lsens”:13}、{ “Lsens”:11}为STM32发送的数据结构,13、11为Qt解析的数据值。
    在这里插入图片描述

2、使用keil提供的JSON库——Jansson
(在工程中添加STM32的JSON库方法见https://blog.csdn.net/yannanxiu/article/details/52712723)
在main.c中添加#include <jansson.h>,keil的JSON库构建数据结构函数与cJSON不同,如下:

void jansson_pack_test(void)
{
    json_t *root;
    char *out;
    char buffer[4] = {'t', 'e', 's', 't'};
    /* Build an empty JSON object */
    root = json_pack("{}");
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Build the JSON object {"foo": 42, "bar": 7} */
    root = json_pack("{sisi}", "foo", 42, "bar", 7);
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Like above, ':', ',' and whitespace are ignored */
    root = json_pack("{s:i, s:i}", "foo", 42, "bar", 7);
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Build the JSON array [[1, 2], {"cool": true}] */
    root = json_pack("[[i,i],{s:b}]", 1, 2, "cool", 1);
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Build a string from a non-null terminated buffer */
    
    root = json_pack("[s#]", buffer, 4);
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
 
    /* Concatenate strings together to build the JSON string "foobarbaz" */
    root = json_pack("[s++]", "foo", "bar", "baz");
 
    out = json_dumps(root, JSON_ENCODE_ANY);
    printf("out:%s\r\n", out);
    free(root);
    free(out);
}

在自己实际应用时,根据自己需要来构建数据结构

  • 2.1
    STM32函数部分:构建{ “Lsens”:Data_cJSON(传感器数据)}
/*********************************
@Function :使用keil的json库创建数据格式
*********************************/
void jansson_test(u8 Data_cJSON)
{
    json_t *root;
    char *out;
		/* Like above, ':', ',' and whitespace are ignored */
		root = json_pack("{si}", "Lsens", Data_cJSON);
		out = json_dumps(root, JSON_ENCODE_ANY);
		printf("%s\r\n", out);
		free(out);   
        json_delete(root);  //先free,再json_delete组合最好,内存才能释放
}
  • 2.2
    上位机函数部分:解析{ “Lsens”:Data_cJSON(传感器数据)}中的Data_cJSON,Qt解析部分不变,效果如下
    在这里插入图片描述
    3、应用工程
    STM32工程以及Qt部分下载链接如下:
    基于STM32的cJSON应用
    https://download.csdn.net/download/liujunping11/33143631
    基于Qt上位机解析cJSON的串口小工具
    https://download.csdn.net/download/liujunping11/33143700
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cJSON介绍与应用—基于VS以及STM32单片机 的相关文章

  • 如何通过填充 NSDictionary 以 JSON 格式发送 UIImage

    我正在尝试使用 JSON 将数据发送到服务器 我可以使用我的对象和关键参数创建 NSDictionary 但我想发送我的图片 图片是UIImage NSDictionary mainJSON NSDictionary dictionaryW
  • Qt - 如何使用 QNetworkAccessmanager 获取响应文本

    这是我的代码 Widget Widget manager new QNetworkAccessManager this connect manager SIGNAL finished QNetworkReply this SLOT repl
  • 使用 JSON 文件动态更新 HTML 内容?

    我想创建一个 JS 循环 使用 jQuery 来查看 JSON 文件 并根据是否 div ids 与 JSON id 值匹配 这需要易于扩展并且无论有多少人都可以工作 div 添加了盒子 我有一个 HTML 文件 设置如下 div clas
  • Python:json_normalize pandas 系列给出 TypeError

    我在 pandas 系列中有数万行像这样的 json 片段df json IDs lotId 1 Id 123456 date 2009 04 17 bidsCount 2 IDs lotId 2 Id 123456 date 2009 0
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 一个具有完全透明背景的qt小部件

    我需要创建一个 qt 小部件 它将充当其他一些小部件的父级 并对它们进行排序 现在的问题是如何使其背景完全透明 我想这样做 struct Imp Imp QWidget parent thisWidget new QWidget paren
  • 将 JSON 数据导入 Google 表格

    我从 Web 服务中提取数据 其格式为 JSON 我正在为 Google Sheets 编写一个 Google Apps 脚本 它将为我填充数据 我的问题是 我似乎无法解析它 Doing var dataset myJSONtext Bro
  • PyQt5 使动态小部件可点击并将参数传递给另一个函数

    我正在尝试制作动态小部件并使它们可点击 通过单击一个小部件 它应该将动态值传递给其他小部件 我尝试过 sender 和其他访问小部件的选项 但没有任何效果 所有小部件都从最后一个小部件发送信息 下面是代码 import sys from P
  • 如何在不声明 32 个插槽的情况下将 32 个按钮的 pressed() 信号连接到单个函数?

    我有一个小部件 里面有 32 个按钮 我需要将每个按钮的 Pressed 信号连接到一个插槽 以便调用一个函数 该函数的参数取决于我按下的按钮 现在我通过以 on QPushButtonName pressed 的形式添加 32 个插槽来做
  • JSONObject 文本必须以“{”开头错误

    我有来自我们的 REST 服务之一的 JSON category name Industry Components categoryId 1 category name Business Components categoryId 2 ca
  • 如何使用 tqdm 实现 JSON 文件加载进度条?

    我正在编写一个用于 JSON 文件处理的 Python 脚本 它基本上分为三个过程 加载 编码和打印 虽然我已经使用 tqdm 轻松创建了用于编码和打印的进度条 但我不知道如何进行加载 我已经彻底阅读了 tqdm 文档 甚至在这里进行了搜索
  • 使用 swagger-ui-express 和 swagger-jsdoc 时如何在 swagger 文件中正确使用 $ref

    我开始使用 swagger 与swagger ui express and swagger jsdoc自动记录我现有的 API 它是用nodejs并表达 就像这里描述的那样 example http www acuriousanimal c
  • 如何将 JSON 转换为 Scala 中的类型

    我的问题是我收到来自 twitter 的 JSON 文本 然后我想将此文本转换为 scala 中的本机对象 有标准方法可以做到这一点吗 我也在用Play 2 这是我所拥有的 import scala io Source fromInputS
  • 如何使用 Objective-C 解析 JSON?

    我是 iPhone 新手 谁能告诉我解析此数据并获取活动详细信息 名字和姓氏的步骤 error false data activity id 35336 user id 1 user first name Chandra Bhusan us
  • jQuery FullCalendar 不渲染

    我的网站上有一个可用的完整日历 但是 直到您更改月份 年份或选择 今天 后 实际的日历表才会显示 如果我查看渲染的源代码 我会发现桌子周围的 div 是空的 直到我按下按钮 div class fc view fc view month f
  • jQuery.getJSON:如何避免在每次刷新时请求 json 文件? (缓存)

    在此示例中 您可以看到生成的 HTML 列表 每次刷新时 脚本都会请求数据文件 ajax test json 并再次构建列表 生成的文件 ajax test json 被静态缓存 但是如何避免在每次刷新时请求此文件 source jquer
  • 向对象添加元素

    我需要填充一个 json 文件 现在我有这样的东西 element id 10 quantity 1 我需要添加另一个 元素 我的第一步是使用该 json 将该 json 放入对象类型中cart JSON parse 现在我需要添加新元素
  • 如何在 SQL 选择查询中将行转换为 JSON?

    以下查询将整个表返回为单个 JSON 字符串 JSON 对象列表 每行一个 SELECT FROM MyTable FOR JSON AUTO 我需要返回多行 其中每行都是表中单行的 JSON 字符串 例如 如果表字段为 A B C 输出应
  • Polymer core-ajax 不会发布 JSON?

    我正在使用 core ajax 来检索 JSON 数据 将组件翻转为 JSON 格式回传到服务器则完全是另一回事 在所有情况下 无论传入的 contentType 或 handleAs 参数如何 作为输入传入的 JSON 对象似乎都会被转换
  • ThreeJS无法加载Json文件

    首先 我已经读过这个问题 https stackoverflow com questions 17201888 three js exporter export object not working with jsonloader r58没

随机推荐

  • 视频编解码(一):ffmpeg编码H.264帧类型判断

    本文主要讲述ffmpeg编码过程中是如何设置I帧 B帧及P帧的 以及如何通过代码判断帧类型 之前看过很多网上的文章 讲述如何判断I帧 B帧 P帧 然而都是停留在H 264官方文档中的定义 如果不结合ffmpeg 就仿佛纸上谈兵 有点不切实际
  • 人脸识别5.1- insightface人脸检测模型scrfd-训练实战笔记,目标检测的理论理解

    1 insightface detection scrfd模型训练 1 0 数据集 数据集下载说明 https github com deepinsight insightface tree master detection dataset
  • Java面向对象编程

    对于IP地址130 63 160 2 MASK为255 255 255 0 子网号为 A 160 2 B 160 C 63 160 D 130 63 160 答案 B 将网络物理地址转换为IP地址的协议是 A IP B ICMP C ARP
  • uni-app项目中引入uView组件库

    在uni app项目中引入uView组件库 其实uView的官方文档写的很清楚了 但是作为菜鸟踩过坑的我还是记录一下 什么是uView uView是uni app生态专用的UI框架 uni app 是一个使用 Vue js 开发所有前端应用
  • Linux 中的 chmod 命令及示例

    在 Unix 操作系统中 chmod命令用于更改文件的访问模式 该名称是change mode的缩写 其中规定每个文件和目录都有一组权限来控制权限 例如谁可以读取 写入或执行该文件 其中权限分为三类 同时读 写和执行 用 r w 和 x 表
  • Java程序员需看的面试题

    进大厂是大部分程序员的梦想 而进大厂的门槛也是比较高的 所以这里整理了一份阿里 美团 滴滴 头条等大厂面试大全 对于Java后端的朋友来说应该是最全面最完整的面试备战仓库 为了更好地整理每个模块 我也参考了很多网上的优质博文和项目 力求不漏
  • 在父子页面嵌套的结构中,当父页面完成某个操作后给子页面一个回调函数

    企业级系统中有一种常见的页面结构 所有的表单都套在一个父页面里 有业务场景 要求父页面在子页面完成加载后做一些操作 如下 这些代码不是本文的重点内容 不做介绍了 这里的iframe是元素 init my iframe function if
  • 策略模式对象初始化为空解决方案及项目中具体的使用

    使用类 Component public class TaskReceiver Autowired TaskHandlerMapping mapper RabbitHandler RabbitListener queues MqTaskCo
  • 【OPENGLES】opengles-jni实例1

    首先 说明下为什么要用jni实现opengl es 在进行移动端图像算法开发的过程中 需要完成对大量的数据进行处理 opengl是在进行图形渲染或者大批量图像运算处理时有着很大的优势 如果能够在算法库开发中加入opengl 则对于提升算法运
  • dos磁盘管理命令

    dos磁盘管理命令 前言 磁盘管理命令用于日常的磁盘维护 DOS命令行提供了多种文件管理命令用于设置和管理磁盘列表 由于很多磁盘在没有安装图形界面的时候就需要对其进行操作 所以掌握DOS命令行下的磁盘管 理命令对系统管理员是十分必要的 磁盘
  • 区域气象-大气化学在线耦合模式(WRF/Chem)在大气环境领域实践技术应用

    大气污染是工农业生产 生活 交通 城市化等方面人为活动的综合结果 同时气象因素是控制大气污染的关键自然因素 大气污染问题既是局部 当地的 也是区域的 甚至是全球的 本地的污染物排放除了对当地造成严重影响外 同时还会在动力输送作用下 极大地影
  • 【小程序】解析小程序原理

    本文首发自 前端修罗场 一个专注 Web 技术 答疑解惑 面试辅导 职业发展的社区 实际学习过程中 有些同学常常会对小程序和 Web 应用之间的差别产生疑惑 它们之间到底有什么不同 Web 应用不能作为小程序吗 本期文章将会带你比较小程序和
  • JS如何判断是否为null、undefined、NaN

    判断null var exp null if exp typeof exp undefined exp 0 alert is null typeof exp undefined 排除了 undefined exp 0 排除了数字零和 fal
  • 【观影笔记】地平线:大数据时代(BBC)

    地平线 大数据时代 BBC 影片中的实例 大数据分析所需要素 感悟 影片中的实例 洛杉矶 利用预测地震余震发生的模型来预测犯罪 数据挖掘起源 约翰 格兰特Graunt 伦敦黑死病死亡记录 Phil Beales 基因生物学寻找疾病治疗方法
  • PostgreSQL 基本安装总结

    一 Mac 环境下的安装 brew install postgresql 1 1 查看当前环境版本 pg ctl V 1 2 初始化数据库 在开始使用数据库前 需要在磁盘上初始化一个数据库存储区域 通常称之为一个数据库集簇 SQL标准使用的
  • fastjson 问题

    问题 1 fastjson value 为null key 会丢失问题 2 SerializerFeature 配置参数 背景 和第三方系统进行对接 两边商量好了接口定义 有些是非必填项 从数据库查询出来的数据赋值给相应的key 有些Str
  • 会议是浪费工作时间的最佳去处

    本文为翻译初稿 更多精彩内容 敬请关注 高效能程序员的修炼 人民邮电出版社 今天你开了多少个会 这个星期呢 这个月呢 现在你再自问一下 那些会议中有多少是值得参加的 如果把相同的时间用在工作上 你又能完成多少事情 这不禁让人想知道 我们究竟
  • 【设计模式

    every blog every motto You can do more than you think https blog csdn net weixin 39190382 type blog 0 前言 设计模式 上 创建型 设计模式
  • 基于51单片机无线NRF24L01的温湿度光照采集

    接收端 原理图 发送端 原理图 实物焊接图 主端源程序 发送端程序 从机NRF24L01程序 ifndef API DEF define API DEF Define interface to nRF24L01 Define SPI pin
  • cJSON介绍与应用—基于VS以及STM32单片机

    一 cJSON介绍 cJSON是一个使用C语言编写的JSON数据解析器 具有超轻便 可移植 单文件的特点 使用MIT开源协议 cJSON的源码文件只有两个 1 cJSON h 2 cJSON c 使用的时候 只需要将这两个文件复制到工程目录