热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cjson使用_Keil环境下Jansson解析库的使用——基于STM32F103

前言之前我曾经写过几个JSON解析库的使用方法:Qt平台下使用QJson解析和构建JSON字符串使用cJSON库解析JSON使用cJSON库构建JSO
ccb0e73bb9ebdca64559c657206d36aa.png

前言

之前我曾经写过几个JSON解析库的使用方法:

Qt平台下使用QJson解析和构建JSON字符串

使用cJSON库解析JSON

使用cJSON库构建JSON

对于嵌入式开发,比较常用的就是cJSON解析库了,但是使用这个库对内存开销比较大,需要大量使用malloc和free进行动态内存分配和释放。对于单片机这种资源短缺的芯片来说,简直是太吃力了。使用STM32等单片机,不能解析多层JSON时,还需要调大堆栈。

今天来了解一下一个和cJSON非常类似的解析库——Jansson的使用,支持解析和构建JSON字符串,不需要动态分配内存,使用方法和cJSON几乎一样。

本文以Keil环境下的Jansson为例,介绍多种不同格式的JSON字符串解析。

示例工程下载:whik1194-JanssonDemo.rar

Jansson的安装

Jansson的安装非常简单,到Keil官网下载一个Jansson的Pack包即可: Keil.Jansson.1.0.0.pack,点击直接下载。

安装完成之后,如果要在当前项目中添加Jansson解析库,在Keil中勾选上Jansson即可,选择完成之后,在当前工程下会出现两个文件:jansson_CM3LE.libjansson_config.c

30ae699c232ac7a95d38d858077952bf.png

在要使用的文件中包含头文件:#include

为了方便调试,自定义实现了一个串口格式化输出函数:LOG1。

void LOG1(char *fmt,...)
{unsigned char UsartPrintfBuf[296];va_list ap;unsigned char *pStr = UsartPrintfBuf;va_start(ap, fmt);vsnprintf((char *)UsartPrintfBuf, sizeof(UsartPrintfBuf), fmt, ap); //格式化va_end(ap);while(*pStr != 0){while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);USART_SendData(USART1, *pStr++);}
}

示例1:纯键值对

JSON字符串,包括字符串、整形和布尔类型三种类型的键值对:

{"status": true,"age": 20,"name": "whik1194","blog": "https://blog.csdn.net/whik1194","wechat": "mcu149"
}

解析函数:

uint8_t Jansson1_Demo(void)
{const char *text = "{"status":true,"age":20,"score":78.4,"name":"whik1194","blog":"https://blog.csdn.net/whik1194","wechat":"mcu149"}";json_error_t error;json_t *root;json_t *status;char *name, *blog, *wechat;int age;double score;root = json_loads((const char*)text, 0, &error); if(json_is_object(root)){LOG1("root format correctrn");/* string 类型的解析 */name = (char *)json_string_value(json_object_get(root, "name"));blog = (char *)json_string_value(json_object_get(root, "blog"));wechat = (char *)json_string_value(json_object_get(root, "wechat"));LOG1("name: %srn", name);LOG1("blog: %srn", blog);LOG1("wechat: %srn", wechat);/* int 类型的解析 */age = json_integer_value(json_object_get(root, "age"));LOG1("age: %drn", age);/* double 类型的解析 */score = json_real_value(json_object_get(root, "score"));LOG1("score: %.1frn", score);/* bool 类型的解析 */status = json_object_get(root, "status");if(json_is_true(status))LOG1("status: truern");else if(json_is_false(status))LOG1("status: falsern");}else{printf("root format error:%d-%srn", error.line, error.text);return 1;}return 0;
}

运行结果:

97adc038eb114f99c6d77438d1cb9112.png

示例2:键的值是一个对象

JSON字符串,其中result键的值是一个JSON对象,包括几组键值对:

{"success": "1","result": {"timestamp": "1592640249","datetime_1": "2020-06-20 16:04:09","week_1": "6","week_2": "Saturday"}
}

解析函数:

uint8_t Jansson2_Demo(void)
{const char *text = "{"success":"1","result":{"timestamp":"1592640249","datetime_1":"2020-06-20 16:04:09","week_1":"6","week_2":"Saturday"}}";json_error_t error;json_t *root;json_t *result;char *success;char *timestamp;char *datetime_1;char *week_1;root = json_loads((const char*)text, 0, &error); if(json_is_object(root)){LOG1("root format correctrn");success = (char *)json_string_value(json_object_get(root, "success"));LOG1("success:%srn", success);result = json_object_get(root, "result");if(json_is_object(result)){timestamp = (char *)json_string_value(json_object_get(result, "timestamp"));datetime_1 = (char *)json_string_value(json_object_get(result, "datetime_1"));week_1 = (char *)json_string_value(json_object_get(result, "week_1"));LOG1("timestamp:%srn", timestamp);LOG1("datetime_1:%srn", datetime_1);LOG1("week_1:%srn", week_1);}else {LOG1("reuslt format errorrn");return 1;}}else{LOG1("root format error:%d-%srn", error.line, error.text);return 1;}return 0;
}

运行结果:

d46875dc11741f562904a131536138f4.png

示例3:键的值是一个数组

JSON字符串,键的值是一个JSON数组,包含两个JSON对象:

{"location": [{"name": "Faye","address": "Beijing"}, {"name": "Andy","address": "ShangHai"}, {"name": "Lisa","address": "ShenZhen"}],"time": "2018-11-17"
}

解析函数:

uint8_t Jansson3_Demo(void)
{const char *text = "{"location":[{"name":"Faye","address":"Beijing"},{"name":"Andy","address":"ShangHai"},{"name":"Lisa","address":"ShenZhen"}],"time":"2018-11-17"}";json_error_t error;json_t *root;json_t *location_arr;json_t *location;char *name, *address;char *time;int idx;root = json_loads((const char*)text, 0, &error); if(json_is_object(root)){LOG1("root format correctrn");time = (char *)json_string_value(json_object_get(root, "time"));location_arr = json_object_get(root, "location");if(json_is_array(location_arr)){for(idx = 0; idx }

运行结果:

deafb20da428d451383da4ccb1917118.png

注意

如果出现解析失败,或者解析错误,可以尝试增加Heap_Size大小:

8cd4ede3ca7d70ade1c47d36a9d67ee3.png

不知道是不是编码的问题,Jansson并不支持含有中文的JSON字符串解析,会报格式错误。

示例工程下载:whik1194-JanssonDemo.rar



推荐阅读
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 标题: ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
author-avatar
mobiledu2502882543
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有