您的位置:

Jansson:C语言中的JSON编解码库

一、简介

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接口也非常简单易用,使得开发人员能够快速上手。希望这篇文章对大家有所帮助!