一、简介
Jansson是一个C语言编写的JSON处理库,提供了JSON编解码、读写、遍历等一系列操作。Jansson支持RFC7159和ECMA-404定义的JSON格式。Jansson的API接口清晰、简洁易用。Jansson是以MIT许可证发布。
二、Jansson的安装
Jansson可以通过源码下载或者使用包管理器直接下载安装。
1、下载源码安装
curl -L -O https://github.com/akheron/jansson/archive/v2.13.1.tar.gz
tar xzf v2.13.1.tar.gz
cd jansson-2.13.1/
./configure
make test # Optional
sudo make install
2、使用包管理器安装
2.1、Ubuntu
sudo apt-get install libjansson-dev
2.2、CentOS
sudo yum install jansson-devel
三、Jansson的API接口
Jansson的API接口分为两类:一类是面向JSON对象的接口,另一类是面向JSON数组的接口。
1、面向JSON对象的接口
Jansson定义了一个jansson_t结构体表示JSON对象,jansson_t结构体中包括了几种不同的类型,例如:number、string、boolean、null、object和array。下面我们来看一下jansson_t结构体的定义:
typedef struct {
enum {
JSON_NULL,
JSON_TRUE,
JSON_FALSE,
JSON_NUMBER,
JSON_STRING,
JSON_ARRAY,
JSON_OBJECT
} type;
union {
struct {
size_t n_size;
double n;
} number;
struct {
size_t len;
char *data;
} string;
struct {
size_t length;
void **elements;
} array;
struct {
size_t length;
void **keys;
void **values;
} object;
} value;
} json_t;
Jansson库中面向JSON对象的API接口非常丰富,下面简单介绍几个常见的API接口:
(1)创建JSON对象
// 创建一个null值的JSON对象
json_t *json_null(void);
// 创建一个true值的JSON对象
json_t *json_true(void);
// 创建一个false值的JSON对象
json_t *json_false(void);
// 创建一个整数JSON对象
json_t *json_integer(json_int_t value);
// 创建一个双精度浮点数JSON对象
json_t *json_real(double value);
// 创建一个字符串JSON对象
json_t *json_string(const char *value);
// 创建一个空的JSON对象
json_t *json_object(void);
// 创建一个空的JSON数组对象
json_t *json_array(void);
(2)获取JSON对象的值
// 返回JSON对象的类型
json_type json_typeof(const json_t *json);
// 返回JSON对象的字符串值
const char *json_string_value(const json_t *json);
// 返回JSON对象的整数值
json_int_t json_integer_value(const json_t *json);
// 返回JSON对象的浮点数值
double json_real_value(const json_t *json);
// 返回JSON对象的数组长度
size_t json_array_size(const json_t *array);
// 返回JSON对象的数组元素
json_t *json_array_get(const json_t *array, size_t index);
// 返回JSON对象的对象成员数量
size_t json_object_size(const json_t *object);
// 返回JSON对象的对象成员的JSON对象
json_t *json_object_get(const json_t *object, const char *key);
(3)设置JSON对象的值
// 设置JSON对象的整数值
int json_integer_set(json_t *json, json_int_t value);
// 设置JSON对象的浮点数值
int json_real_set(json_t *json, double value);
// 设置JSON对象的字符串值
int json_string_set(json_t *json, const char *value);
// 给JSON对象添加一个元素(数组类型)
int json_array_append_new(json_t *json, json_t *value);
// 向JSON对象中添加一个对象成员
int json_object_set_new(json_t *object, const char *key, json_t *value);
(4)遍历JSON对象
// 遍历JSON数组
void json_array_foreach(json_t *array, json_array_foreach_t foreach_func, void *foreach_data);
// 遍历JSON对象
void json_object_foreach(json_t *object, const char *key, json_t *value);
// 遍历JSON对象的所有成员
void json_object_set_new(json_t *object, const char *key, json_t *value);
2、面向JSON数组的接口
Jansson库中面向JSON数组的API接口也非常的丰富,下面简单介绍几个常见的API接口:
(1)创建JSON数组
// 创建空的JSON数组
json_t *json_array(void);
// 向JSON数组中添加元素
int json_array_append_new(json_t *array, json_t *value);
// 移除JSON数组中的元素
int json_array_remove(json_t *array, size_t index);
// 清空JSON数组
void json_array_clear(json_t *array);
(2)遍历JSON数组
// 遍历JSON数组
void json_array_foreach(json_t *array, json_array_foreach_t foreach_func, void *foreach_data);
四、实战:使用Jansson解析JSON数据
下面我们来看一下使用Jansson解析JSON数据的基本流程代码:
// cJSON库
#include <jansson.h>
int main(void)
{
// JSON数据字符串
const char *json_string = "{ \
\"name\": \"Tom\", \
\"age\": 18, \
\"man\": true, \
\"girls\": [ \
{ \"name\": \"Lily\", \"age\": 17 }, \
{ \"name\": \"Lucy\", \"age\": 18 } \
] \
}";
json_error_t error;
json_t *root, *name, *age, *man, *girls, *girl, *girl_name, *girl_age;
// 解析JSON字符串
root = json_loads(json_string, 0, &error);
// 获取name字段的值
name = json_object_get(root, "name");
const char *name_value = json_string_value(name);
// 获取age字段的值
age = json_object_get(root, "age");
int age_value = json_integer_value(age);
// 获取man字段的值
man = json_object_get(root, "man");
int man_value = json_is_true(man);
// 获取girls字段的值
girls = json_object_get(root, "girls");
// 遍历girls数组
size_t index;
json_t *value;
json_array_foreach(girls, index, value) {
girl = value;
girl_name = json_object_get(girl, "name");
girl_age = json_object_get(girl, "age");
const char *girl_name_value = json_string_value(girl_name);
int girl_age_value = json_integer_value(girl_age);
}
// 释放JSON对象
json_decref(root);
return 0;
}
五、总结
Jansson是一个非常强大的C语言JSON处理库,很方便的进行JSON数据的解析和生成。同时Jansson的API接口也非常简单易用,使得开发人员能够快速上手。希望这篇文章对大家有所帮助!