C语言 CJSON使用实例


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • C语言 CJSON使用实例
  • 前言
  • 一、cJSON实例
    • 1. json数据的封装
    • 2. json数据解析

前言

提示:这里可以添加本文要记录的大概内容:

JSON数据是一种轻量级的数据交互格式,在各个领域中普遍存在,如嵌入式中与上位机交互,获取某些API接口数据时,常常会使用到JSON数据,json采用完全独立于语言的文本格式,这些特性使JSON成为理想的数据交互语言,易于解析与生成。

在C语言中,通常使用cJSON对数据进行封装或解析,在使用中不要求熟记于心,但起码得知道怎么用,这对于数据交互相当便利!


提示:以下是本篇文章正文内容,下面案例可供参考

一、cJSON实例

cJSON 一共就两个文件:cJSON.c 和 cJSON.h

1. json数据的封装

创建节点用 cJSON base_config = cJSON_CreateObject();
绑定节点用 cJSON_AddItemToObject(root, “base_config”, base_config);
添加字符串数据用 cJSON_AddStringToObject(net_config, “localIP”, info_cfg->localIP);
添加数字数据用 cJSON_AddNumberToObject(net_config, “localPort”, info_cfg->localPort);
当前节点是数组,添加数组用 cJSON_AddItemToArray(uart_config, uart_dev);

int configInfo_to_buffer(unsigned char *buffer, config_info_t* info_cfg){/*创建一个json对象 */cJSON *root = cJSON_CreateObject();int ret = NOT_OK;if(NULL == root) goto CLOSE_JSON;/*root下的子对象*/cJSON *base_config = cJSON_CreateObject();if(NULL == base_config)goto CLOSE_JSON;/*将子对象绑定在root下*/cJSON_AddItemToObject(root, "base_config", base_config);/*对json子节点 添加数据点*//*字符串*/cJSON_AddStringToObject(base_config, "name", info_cfg->devcieName);/*数字*/cJSON_AddNumberToObject(base_config, "type", info_cfg->deviceType);/*root下的对象*/cJSON *net_config = cJSON_CreateObject();if(NULL == net_config)goto CLOSE_JSON;/*绑定*/cJSON_AddItemToObject(root, "net_config", net_config);cJSON_AddStringToObject(net_config, "localIP", info_cfg->localIP);cJSON_AddNumberToObject(net_config, "localPort", info_cfg->localPort);/*root 下的数组对象*/cJSON *uart_config = cJSON_CreateArray();if(uart_config == NULL)goto CLOSE_JSON;/*绑定*/cJSON_AddItemToObject(root, "uart_config", uart_config);for(int i = 0; i < 2; i++) {cJSON *uart_dev = cJSON_CreateObject();cJSON_AddNumberToObject(uart_dev, "baudrate", info_cfg->uart_dev[i].baudrate);cJSON_AddNumberToObject(uart_dev, "dbit", info_cfg->uart_dev[i].dbit);cJSON_AddNumberToObject(uart_dev, "parity", info_cfg->uart_dev[i].parity);cJSON_AddNumberToObject(uart_dev, "sbit", info_cfg->uart_dev[i].sbit);cJSON_AddItemToArray(uart_config, uart_dev);}/*cJSON_Print 将json打印成字符串*/unsigned char *jsonStr = cJSON_Print(root);strcpy(buffer, jsonStr);free(jsonStr);ret = IS_OK;
CLOSE_JSON://释放内存 释放root就行了cJSON_Delete(root);return ret;
}

对于的JSON数据如下:

{"base_config":    {"name":  "test gateway","type":  0,},"net_config": {"localIP":   "","localPort": 0,},"uart_config":    [{"baudrate": 0,"dbit": 0,"parity":   0,"sbit": 0}, {"baudrate":  0,"dbit": 0,"parity":   0,"sbit": 0}]
}

2. json数据解析

将上面创建的数据进行解析,解析代码如下:
获取节点用 cJSON_GetObjectItem(root, “base_config”);
获取数组大小用 cJSON_GetArraySize(uart_config);
获取指定数组用 cJSON_GetArrayItem(uart_config, i);

int buffer_to_configInfo(unsigned char *buffer, config_info_t* info_cfg){/* 创建json对象 buffer为json数据*/cJSON *root = cJSON_Parse((const char*)buffer);int ret = NOT_OK;if(root == NULL || root->child == NULL)goto CLOSE_JSON;cJSON *base_config = cJSON_GetObjectItem(root, "base_config");if(base_config == NULL || base_config->child == NULL)goto CLOSE_JSON;{cJSON *obj = cJSON_GetObjectItem(base_config, "name");strcpy(info_cfg->devcieName, obj->valuestring);obj = cJSON_GetObjectItem(base_config, "type");info_cfg->deviceType = obj->valueint;}cJSON *net_config = cJSON_GetObjectItem(root, "net_config");if(net_config == NULL || net_config->child == NULL)goto CLOSE_JSON;{cJSON *obj = cJSON_GetObjectItem(net_config, "localIP");strcpy(info_cfg->localIP, obj->valuestring);obj = cJSON_GetObjectItem(net_config, "localPort");info_cfg->localPort = obj->valueint;}//json数组解析cJSON *uart_config = cJSON_GetObjectItem(root, "uart_config");if(uart_config == NULL || uart_config->child == NULL)goto CLOSE_JSON;{ //获取数组大小int uart_size = cJSON_GetArraySize(uart_config);for(int i = 0; i < uart_size; i++) {cJSON *uart_dev = cJSON_GetArrayItem(uart_config, i);cJSON *obj = cJSON_GetObjectItem(uart_dev, "baudrate");info_cfg->uart_dev[i].baudrate = obj->valueint;obj = cJSON_GetObjectItem(uart_dev, "dbit");info_cfg->uart_dev[i].dbit = obj->valueint;obj = cJSON_GetObjectItem(uart_dev, "parity");info_cfg->uart_dev[i].parity = obj->valueint;obj = cJSON_GetObjectItem(uart_dev, "sbit");info_cfg->uart_dev[i].sbit = obj->valueint;}}ret = IS_OK;
CLOSE_JSON://释放内存cJSON_Delete(root);return ret;
}

注意: 如果通过指令编译会出错

cJSON编译会出现pow,floor未定义的引用
这时候加上 -lm就好了

C语言 CJSON使用实例相关推荐

  1. c语言条件编译的例子,C语言条件编译分析实例

    C语言条件编译分析实例 1.利用#ifdef / #endif 将程序功能模块包括进去,以向某用户提供该功能. 在程序首部定义#define HNLD: #ifdef HNLD include&quo ...

  2. 用数据结构c语言写成绩排序,C语言数据结构 快速排序实例详解

    C语言数据结构 快速排序实例详解 一.快速排序简介 快速排序采用分治的思想,第一趟先将一串数字分为两部分,第一部分的数值都比第二部分要小,然后按照这种方法,依次对两边的数据进行排序. 二.代码实现 # ...

  3. c语言编程经典实例利润,C语言经典编程实例100题解答

    C语言经典编程实例100题 答案+答案 C语言经典编程实例100题C语言程序实例100个(一) [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数,都是多少, 1.程序 ...

  4. cjson 对象是json数组型结构体_C语言 - cJSON解析特定格式 含有数组array类型的数据...

    在ESP32中使用了cJSON库,发现很好用.最近服务器端的JSON格式越来越多样,还是有些注意点,需要做下笔记记录下来. cJSON *MAC_arry = cJSON_GetObjectItem( ...

  5. 【视频】什么是梯度下降?用线性回归解释和R语言估计GARCH实例

    全文链接:http://tecdat.cn/?p=23606 梯度下降是一种优化算法,能够为各种问题找到最佳解决方案(点击文末"阅读原文"获取完整代码数据). 梯度下降是什么? 梯 ...

  6. msp430单片机c语言应用程序,MSP430单片机C语言应用程序设计实例精讲

    本书首先介绍了C语言的基本知识,使读者能使用C语言进行程序设计:然后介绍了30个开发例子.全书主要通过实例的形式来介绍MSP430单片机在不同领域中的应用,从而使读者掌握MSP430单片机开发的流程. ...

  7. c语言二级编程实例,二级C语言编程_-实例.doc

    二级C语言编程_-实例.doc 编程实例 ? 1.???????? 1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位.十位.个位的数字都是1.2.3. ...

  8. [R语言基础]——数据处理实例

    [R语言基础]--数据处理实例 前言 问题 Step1:建立数据框 Step2:计算综合得分 Step3:对学生进行评分 Step4:根据姓氏和名字排序 完整代码 前言 之前我们已经学习了R对数据预处 ...

  9. # c语言版:实例:输入一个时间值s,它是距离当日午夜的秒值,计算目前的时间,时间按00:00:00格式输出

    c语言版:实例:输入一个时间值s,它是距离当日午夜的秒值,计算目前的时间,时间按00:00:00格式输出 前言:c语言版本 对于c语言的基础复习 对于if选择判断语句的理解 浮点型输出 提示:以下是本 ...

最新文章

  1. 商品详细信息的代码html_电商网站的商品详情页系统架构
  2. 函数传参字典_Python 函数参数解包
  3. HDU-3177 Crixalis's Equipment 贪心
  4. 从零开始学习docker(六)部署一个稍微复杂一点的应用
  5. kylinH5框架之项目开发调试
  6. 工具使用-----Jmeter的基础用法
  7. linux_adduser
  8. android 开发问题----avd按钮无法按
  9. Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比
  10. java Excel导出 xlsx格式(超简单)
  11. python将pdf文件转换成word文档_python实现pdf转word文档
  12. DB2完整的SQLCODE和SQLState错误信息
  13. 如何对关键词密度设置
  14. 【信息通信与软件工程国际会议】2022年第二届信息通信与软件工程国际会议
  15. 陀螺仪、加速度计与MPU6050的关系
  16. antd Table 列hover高亮
  17. 「应用架构」六边型架构:三个原则和一个实现示例
  18. 【线性代数】分块矩阵的运算、特征值
  19. 微信小程序使用百度api获取天气信息 —— 微信小程序教程系列(16)
  20. 【python 爬虫】 scrapy 入门--爬取百度新闻排行榜

热门文章

  1. 计算机开机界面图片怎么修改,怎么修改Win7开机登录界面壁纸 Win7开机登录界面壁纸修改图文教程...
  2. 【面试题】概率题总结(随机数、抛硬币)
  3. MySQL的Binlog原理
  4. C++使用CFile类文件读写
  5. JFS与JFS2的区别
  6. 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include pch.h”?
  7. 计算机专业英语电池,电池分为哪几种?英文缩写?
  8. 26岁想转行做程序员是否可行?
  9. BackTrack V5的汉化
  10. backtrack 5 虚拟机 安装