本文主要是介绍使用keil提供的JSON库——Jansson,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
keil环境下已经有官方的JSON库了,下面是讲解如何导入和使用Jansson。
下载地址:http://www2.keil.com/mdk5/partnerpacks/
安装并导入工程
下载Keil.Jansson.1.0.0.pack后双击安装,打开keil工程,点击下图的图标配置Json库到工程里。
接下来按图点击,最后点击OK。
最后工程目录下面就有会Jansson的lib文件了。
测试代码
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);
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);
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);
其他信息
- Jansson官网:http://jansson.readthedocs.io/en/latest/
- Jansson API文档:http://jansson.readthedocs.io/en/latest/apiref.html
- keil版本:uVision 5.21a
注意事项
- 解析和生成json的时候要保证有足够的堆空间,如果堆大小不够会处理失败。博主一般设置3KB的heap。
关于中文编码
在评论区有位朋友问为什么用UTF-8编码打包的Json打印出来是乱码。经过博主几天的查资料,现在问题是这样的:实际上用Jansson编码UTF-8的中文是没有问题的,有问题的是串口的打印问题。
这是我测试串口打印中文,首先说明几点,我的文件保存格式是keil默认的格式,也就是ANSI,大家打开记事本然后点击另存为,在保存路径下面可以选择其编码格式:
把串口打印出来的数据拷贝到Notepad++,拷贝前先新建一个文档并以ANSI编码:
拷贝过去后没有出现任何乱码,可见串口打印显示的是ANSI编码字符。
在Notepad++的菜单栏,选择「格式」,「以UTF-8编码」,有无BOM都行,然后看到后面的乱码正常显示中文了:
而且,如果使用非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);
这篇关于使用keil提供的JSON库——Jansson的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!