[应用相关] 使用keil提供的JSON库——Jansson

[复制链接]
6509|19
 楼主| goodluck09876 发表于 2018-9-18 12:27 | 显示全部楼层 |阅读模式
使用keil提供的JSON库——Jansson
 楼主| goodluck09876 发表于 2018-9-18 12:27 | 显示全部楼层
在这篇**中简单介绍了如何把cJSON移植到STM32上,实际上,keil环境下已经有官方的JSON库了——Jansson。下面是讲解如何导入和使用Jansson。
184065ba07eb9dffb2.png
 楼主| goodluck09876 发表于 2018-9-18 12:28 | 显示全部楼层
安装并导入工程
下载Keil.Jansson.1.0.0.pack后双击安装,打开keil工程,点击下图的图标配置Json库到工程里。

925215ba07ece85069.png
 楼主| goodluck09876 发表于 2018-9-18 12:28 | 显示全部楼层
接下来按图点击,最后点击OK。

398905ba07edb6131a.png
 楼主| goodluck09876 发表于 2018-9-18 12:28 | 显示全部楼层
最后工程目录下面就有会Jansson的lib文件了。

61145ba07ef61059a.png
 楼主| goodluck09876 发表于 2018-9-18 12:29 | 显示全部楼层
#include <jansson.h>

//jansson Test
void jansson_pack_test(void)
{
    json_t *root;
    char *out;

    /* 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 */
    char buffer[4] = {'t', 'e', 's', 't'};
    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);
}
 楼主| goodluck09876 发表于 2018-9-18 12:29 | 显示全部楼层
out:{}
out:{
"foo": 42,
"bar": 7
}
out:{
"foo": 42,
"bar": 7
}
out:[[1, 2], {"cool": true}]
out:["test"]
out:["foobarbaz"]
 楼主| goodluck09876 发表于 2018-9-18 12:29 | 显示全部楼层
注意事项
解析和生成json的时候要保证有足够的堆空间,如果堆大小不够会处理失败。博主一般设置3KB的heap。

681435ba07f2f840fa.png
 楼主| goodluck09876 发表于 2018-9-18 12:29 | 显示全部楼层
这是我测试串口打印中文,首先说明几点,我的文件保存格式是keil默认的格式,也就是ANSI,大家打开记事本然后点击另存为,在保存路径下面可以选择其编码格式:

256215ba07f4532527.png
 楼主| goodluck09876 发表于 2018-9-18 12:30 | 显示全部楼层
把串口打印出来的数据拷贝到Notepad++,拷贝前先新建一个文档并以ANSI编码:

821715ba07f4ff0f5c.png
 楼主| goodluck09876 发表于 2018-9-18 12:30 | 显示全部楼层
拷贝过去后没有出现任何乱码,可见串口打印显示的是ANSI编码字符。
在Notepad++的菜单栏,选择「格式」,「以UTF-8编码」,有无BOM都行,然后看到后面的乱码正常显示中文了:

98265ba07f67b539a.png
 楼主| goodluck09876 发表于 2018-9-18 12:30 | 显示全部楼层
而且,如果使用非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);
 楼主| goodluck09876 发表于 2018-9-18 12:31 | 显示全部楼层
/* 文件以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);
 楼主| goodluck09876 发表于 2018-9-18 12:31 | 显示全部楼层
cJSON中用到了malloc,内存释放什么的我就不说了,我出现的问题是一开始就没分配足够的堆空间,导致程序总是莫名奇妙的死机。

 楼主| goodluck09876 发表于 2018-9-18 12:31 | 显示全部楼层
870655ba07fa872b71.png

如上图,将Heap_Size 改大一点就OK了。

 楼主| goodluck09876 发表于 2018-9-18 12:32 | 显示全部楼层
在stm32工程中使用cJSON时解析过长数据出现失败,发现是stm32的heap太小,在内存够用的情况下可以修改icf文件更改heap的大小

磨砂 发表于 2018-10-9 09:45 | 显示全部楼层
请问JSON库是干嘛用的呢
keaibukelian 发表于 2018-10-9 12:03 | 显示全部楼层
在keil上如何运行这个呢 感觉好像不沾边
xiaoqizi 发表于 2018-10-9 13:10 | 显示全部楼层
太详细了  图文并茂
磨砂 发表于 2018-10-10 09:57 | 显示全部楼层
heimaojingzhang 发表于 2018-10-9 11:49
JSON: JavaScript 对象表示法( JavaScript Object Notation) 。是一种轻量级的数据交换格式。 它基于E ...

感谢您的解答
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部