使用keil提供的JSON库——Jansson

2024-06-18 16:32
文章标签 使用 json 提供 keil jansson

本文主要是介绍使用keil提供的JSON库——Jansson,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


前言

keil环境下已经有官方的JSON库了,下面是讲解如何导入和使用Jansson。

keil::Jansson

下载地址:http://www2.keil.com/mdk5/partnerpacks/

安装并导入工程

下载Keil.Jansson.1.0.0.pack后双击安装,打开keil工程,点击下图的图标配置Json库到工程里。

设置keil环境

接下来按图点击,最后点击OK。

这里写图片描述

最后工程目录下面就有会Jansson的lib文件了。

导入成功


测试代码

1.  组装JSON

(1) JSON对象

{"root": {"name": "xiaopeng", "age": 21}}

json_t* root = NULL;
json_t* item = NULL;root = json_object();
item = json_object();char* s_repon = NULL;json_object_set_new(item,"name",json_string("xiaopeng"));
json_object_set_new(item,"age",json_integer(21));
json_object_set_new(root,"root",item);s_repon = json_dumps(root, JSON_INDENT(0));
printf("s_repon = %s \n",s_repon);
free(s_repon);json_decref(root);




(2) JSON 对象数组
{"root": [{"name": "xiaopeng", "age": 21}]}

json_t* root = NULL;
json_t* array = NULL;json_t* item = NULL;root = json_object();
array = json_array();
item = json_object();char* s_repon = NULL;json_object_set_new(item,"name",json_string("xiaopeng"));
json_object_set_new(item,"age",json_integer(21));
json_array_append_new(array, item);json_object_set_new(root,"root",array);s_repon = json_dumps(root, JSON_INDENT(0));
printf("s_repon = %s \n",s_repon);
free(s_repon);json_decref(root);




2 解析JSON

{"led":1}

json_error_t err;
json_t* root = json_loads(paramsBuf, strlen(paramsBuf), &err);
if(NULL != root && json_is_object(root))
{json_t* led = json_object_get(root, "led");if(NULL != led && json_is_real(led)){BSP_LED_On(json_real_value(led));}
}json_decref(root);





其他信息

  1. Jansson官网:http://jansson.readthedocs.io/en/latest/
  2. Jansson API文档:http://jansson.readthedocs.io/en/latest/apiref.html
  3. keil版本:uVision 5.21a

注意事项

  • 解析和生成json的时候要保证有足够的堆空间,如果堆大小不够会处理失败。博主一般设置3KB的heap。 
    修改堆大小


关于中文编码

在评论区有位朋友问为什么用UTF-8编码打包的Json打印出来是乱码。经过博主几天的查资料,现在问题是这样的:实际上用Jansson编码UTF-8的中文是没有问题的,有问题的是串口的打印问题。

串口打印

这是我测试串口打印中文,首先说明几点,我的文件保存格式是keil默认的格式,也就是ANSI,大家打开记事本然后点击另存为,在保存路径下面可以选择其编码格式:

文本文档选择编码格式

把串口打印出来的数据拷贝到Notepad++,拷贝前先新建一个文档并以ANSI编码:

Noted++ ANSI

拷贝过去后没有出现任何乱码,可见串口打印显示的是ANSI编码字符。 
在Notepad++的菜单栏,选择「格式」,「以UTF-8编码」,有无BOM都行,然后看到后面的乱码正常显示中文了:

Noted++ UTF-8

而且,如果使用非UTF-8字符打包Json,Jansson是会返回「Invalid UTF-8 string」错误信息的,当然前提是使用json_pack_ex函数。

/* 文件以ANSI格式存储,keil MDK默认的格式 */
char *zhongwen = "中文";
root = json_pack_ex(&e, JSON_ENCODE_ANY, "[s]", zhongwen);
printf("e:%s\r\n", e.text);



下面放上本小节测试代码。

测试代码

/* 文件以ANSI格式存储,keil MDK默认的格式 */
char *zhongwen = "中文";
char *zhongwen_utf8 = "\xE4\xB8\xAD\xE6\x96\x87";
printf("zhongwen:%s\r\n", zhongwen);
printf("zhongwen_utf8:%s\r\n", zhongwen_utf8);json_error_t e;
root = json_pack_ex(&e, JSON_ENCODE_ANY, "[s]", zhongwen);
printf("e:%s\r\n", e.text);
root = json_pack_ex(&e, JSON_ENCODE_ANY, "[s]", zhongwen_utf8);
printf("e:%s\r\n", e.text);out = json_dumps(root, JSON_ENCODE_ANY);
printf("out:%s\r\n", out);
free(root);
free(out);















本文转自:

http://blog.csdn.net/yannanxiu/article/details/52712723





这篇关于使用keil提供的JSON库——Jansson的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1072515

相关文章

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

JSON Web Token在登陆中的使用过程

《JSONWebToken在登陆中的使用过程》:本文主要介绍JSONWebToken在登陆中的使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录JWT 介绍微服务架构中的 JWT 使用结合微服务网关的 JWT 验证1. 用户登录,生成 JWT2. 自定义过滤

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一