简介
Jansson是一个用于解码、编码、操控JSON的C库。其特性为:
- 简单直观的API和数据模型
- 没有依赖项
- 完整的Unicode支持(UTF-8)
构建
Jansson使用cmake作为构建工具。可以执行下面的命令构建:
|
1
2
3
4
5
|
jansson
jansson
build
.
install
|
上述命令执行后,Jansson的头文件和静态库被安装到/home/alex/CPP/lib/jansson/2.9目录
使用
这里我们创建一个CMake工程:
|
1
2
3
4
5
6
7
|
)
)
)
)
)
)
)
|
解码JSON
下面的代码展示了如何把字符串解码为json_t结构:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <jansson.h>
#include <assert.h>
{
;
;
// json_t用于引用任何JSON节点
;
// 如果读取失败,自动置为空指针
{
;
;
{
// json_is_*宏用于判断数据类型
// 处理JSON对象
;
;
;
;
;
;
// 处理JSON数组
;
;
{
;
;
}
// 减小引用计数,导致资源回收
;
}
;
}
|
运行上述代码后输出:
|
1
2
3
|
30
彩彩
当当
|
编码JSON
下面的代码展示了如何把json_t结构编码为字符串:
|
1
2
3
|
;
;
;
|
运行上述代码后输出:
|
1
2
3
4
5
6
7
8
|
{
,
[
,
,
}
|
打包JSON
下面的代码展示了如何把零散数据打包(pack)为json_t结构:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
;
(
// jansson使用格式限定符来指定要创建的JSON的JSON节点的类型
// 下面的例子创建三元素的数组:字符串、字符串、布尔值
)
;
/* 打包一个空对象 */
;
/* 打包出 {age:30,childNum:2} */
;
;
;
|
可用的格式限定符如下表:
| 限定符 | 说明 |
| s | 将null结尾的UTF-8字符串转换为JSON字符串 |
| s? | 和上面类似,但是如果位置参数是NULL则插入JSON null值 |
| s# | 对应两个位置参数const char *, int,将指定长度的UTF-8缓冲转换为JSON字符串 |
| s% | 和上面类似,只是未知参数类型为const char *, size_t |
| + | 把此位置参数连接到前一个位置参数后面 |
| +# | 和上面类似,接收位置参数const char *, int |
| +% | 和上面类似,接收位置参数const char *, size_t |
| n | 输出null,不消耗位置参数 |
| b | 转换int为JSON布尔值 |
| i | 转换int为JSON整数 |
| I | 转换json_int_t为JSON整数 |
| f | 转换double为JSON实数 |
| o | 原样插入json_t*结构 |
| O | 和上面类似,但是目标json_t的引用计数会增加 |
| o? o? | 类似上面两个,但是当位置参数为NULL时插入null |
| [fmt] | 使用内部的格式限定符构建一个JSON数组,fmt可以是任意符合要求的格式限定符序列 |
| {fmt} | 使用内部的格式限定符构建一个JSON对象,fmt可以是任意符合要求的格式限定符序列 |
解包JSON
下面的代码展示了如何把json_t结构解包为零散数据:
|
1
2
3
4
5
6
|
;
;
;
// 可以仅仅解包一部分
;
;
|