简介:
Jansson是一个用于解码、编码、操控JSON的C库。其特性为:
简单直观的API和数据模型
没有依赖项
完整的Unicode支持(UTF-8)
需要的头文件: #include
格式限定符:

应用举例:
解码JSON
下面的代码展示了如何把字符串解码为json_t结构:
C
#include
#include
int main() {
char *text = "{ \"name\":\"汪震\", \"age\":30, \"children\":[ \"彩彩\", \"当当\" ] }";
json_error_t error;
// json_t用于引用任何JSON节点
json_t *root = json_loads( text, 0, &error );
// 如果读取失败,自动置为空指针
if ( !root ) {
fprintf( stderr, "error: on line %d: %s\n", error.line, error.text );
return 1;
} else {
// json_is_*宏用于判断数据类型
// 处理JSON对象
assert( json_is_object( root ));
json_t *name, *age, *children;
name = json_object_get( root, "name" );
age = json_object_get( root, "age" );
fprintf( stdout, "NAME: %s, AGE: %d\n", json_string_value( name ), json_integer_value( age ));
children = json_object_get( root, "children" );
// 处理JSON数组
assert( json_is_array( children ));
int sof = json_array_size( children );
for ( int i = 0; i != sof; i++ ) {
json_t *child = json_array_get( children, i );
fprintf( stdout, "CHILDREN: %s\n", json_string_value( child ));
}
// 减小引用计数,导致资源回收
json_decref( root );
}
return 0;
}
运行上述代码后输出:
NAME: 汪震, AGE: 30
CHILDREN: 彩彩
CHILDREN: 当当
编码JSON
下面的代码展示了如何把json_t结构编码为字符串:
C
json_t *root = json_pack( "{sssis[ss]}", "name", "汪震", "age", 30, "children", "彩彩", "当当" );
char *text = json_dumps( root, JSON_INDENT( 4 ) | JSON_SORT_KEYS );
fprintf( stdout, "%s\n", text );
运行上述代码后输出:
{
"age": 30,
"children": [
"彩彩",
"当当"
],
"name": "汪震"
}
打包JSON
下面的代码展示了如何把零散数据打包(pack)为json_t结构:
assert( json_is_integer( json_pack( "i", 1 )));
assert( json_is_array(
// jansson使用格式限定符来指定要创建的JSON的JSON节点的类型
// 下面的例子创建三元素的数组:字符串、字符串、布尔值
json_pack( "[ssb]", "foo", "bar", 1 )
));
/* 打包一个空对象 */
json_pack( "{}" );
/* 打包出 {age:30,childNum:2} */
json_pack( "{sisi}", "age", 30, "childNum", 2 );
/* 打包出 [[1, 2], {"num": true}] */
json_pack( "[[i,i],{s:b}]", 1, 2, "num", 1 );
return 0;
解包JSON
下面的代码展示了如何把json_t结构解包为零散数据:
json_t *root = json_pack( "{sssis[ss]}", "name", "汪震", "age", 30, "children", "彩彩", "当当" );
char *name;
int age;
// 可以仅仅解包一部分
json_unpack( root, "{sssi}", "name", &name, "age", &age );
fprintf( stdout, "NAME: %s, AGE:%d\n", name, age );
Refer:
Jansson API 介绍