打印
[应用相关]

使用keil提供的JSON库——Jansson

[复制链接]
5379|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用keil提供的JSON库——Jansson
沙发
goodluck09876|  楼主 | 2018-9-18 12:27 | 只看该作者
在这篇**中简单介绍了如何把cJSON移植到STM32上,实际上,keil环境下已经有官方的JSON库了——Jansson。下面是讲解如何导入和使用Jansson。

使用特权

评论回复
板凳
goodluck09876|  楼主 | 2018-9-18 12:28 | 只看该作者
安装并导入工程
下载Keil.Jansson.1.0.0.pack后双击安装,打开keil工程,点击下图的图标配置Json库到工程里。

使用特权

评论回复
地板
goodluck09876|  楼主 | 2018-9-18 12:28 | 只看该作者
接下来按图点击,最后点击OK。

使用特权

评论回复
5
goodluck09876|  楼主 | 2018-9-18 12:28 | 只看该作者
最后工程目录下面就有会Jansson的lib文件了。

使用特权

评论回复
6
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);
}

使用特权

评论回复
7
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"]

使用特权

评论回复
8
goodluck09876|  楼主 | 2018-9-18 12:29 | 只看该作者
注意事项
解析和生成json的时候要保证有足够的堆空间,如果堆大小不够会处理失败。博主一般设置3KB的heap。

使用特权

评论回复
9
goodluck09876|  楼主 | 2018-9-18 12:29 | 只看该作者
这是我测试串口打印中文,首先说明几点,我的文件保存格式是keil默认的格式,也就是ANSI,大家打开记事本然后点击另存为,在保存路径下面可以选择其编码格式:

使用特权

评论回复
10
goodluck09876|  楼主 | 2018-9-18 12:30 | 只看该作者
把串口打印出来的数据拷贝到Notepad++,拷贝前先新建一个文档并以ANSI编码:

使用特权

评论回复
11
goodluck09876|  楼主 | 2018-9-18 12:30 | 只看该作者
拷贝过去后没有出现任何乱码,可见串口打印显示的是ANSI编码字符。
在Notepad++的菜单栏,选择「格式」,「以UTF-8编码」,有无BOM都行,然后看到后面的乱码正常显示中文了:

使用特权

评论回复
12
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);

使用特权

评论回复
13
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);

使用特权

评论回复
14
goodluck09876|  楼主 | 2018-9-18 12:31 | 只看该作者
cJSON中用到了malloc,内存释放什么的我就不说了,我出现的问题是一开始就没分配足够的堆空间,导致程序总是莫名奇妙的死机。

使用特权

评论回复
15
goodluck09876|  楼主 | 2018-9-18 12:31 | 只看该作者


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

使用特权

评论回复
16
goodluck09876|  楼主 | 2018-9-18 12:32 | 只看该作者
在stm32工程中使用cJSON时解析过长数据出现失败,发现是stm32的heap太小,在内存够用的情况下可以修改icf文件更改heap的大小

使用特权

评论回复
17
磨砂| | 2018-10-9 09:45 | 只看该作者
请问JSON库是干嘛用的呢

使用特权

评论回复
18
keaibukelian| | 2018-10-9 12:03 | 只看该作者
在keil上如何运行这个呢 感觉好像不沾边

使用特权

评论回复
19
xiaoqizi| | 2018-10-9 13:10 | 只看该作者
太详细了  图文并茂

使用特权

评论回复
20
磨砂| | 2018-10-10 09:57 | 只看该作者
heimaojingzhang 发表于 2018-10-9 11:49
JSON: JavaScript 对象表示法( JavaScript Object Notation) 。是一种轻量级的数据交换格式。 它基于E ...

感谢您的解答

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

220

主题

5843

帖子

21

粉丝