一、簡介
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接口也非常簡單易用,使得開發人員能夠快速上手。希望這篇文章對大家有所幫助!
原創文章,作者:BMRUK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/372890.html