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接口也非常簡單易用,使得開發人員能夠快速上手。希望這篇文章對大家有所幫助!

原創文章,作者:BMRUK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/372890.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
BMRUK的頭像BMRUK
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相關推薦

  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29
  • JSON的MD5

    在Web開發過程中,JSON(JavaScript Object Notation)是最常用的數據格式之一。MD5(Message-Digest Algorithm 5)是一種常用…

    編程 2025-04-29
  • 使用Java將JSON寫入HDFS

    本篇文章將從以下幾個方面詳細闡述Java將JSON寫入HDFS的方法: 一、HDFS簡介 首先,先來了解一下Hadoop分佈式文件系統(HDFS)。HDFS是一個可擴展性高的分佈式…

    編程 2025-04-29
  • Python語言由荷蘭人為中心的全能編程開發工程師

    Python語言是一種高級語言,很多編程開發工程師都喜歡使用Python語言進行開發。Python語言的創始人是荷蘭人Guido van Rossum,他在1989年聖誕節期間開始…

    編程 2025-04-28
  • Python語言設計基礎第2版PDF

    Python語言設計基礎第2版PDF是一本介紹Python編程語言的經典教材。本篇文章將從多個方面對該教材進行詳細的闡述和介紹。 一、基礎知識 本教材中介紹了Python編程語言的…

    編程 2025-04-28
  • Python語言實現人名最多數統計

    本文將從幾個方面詳細介紹Python語言實現人名最多數統計的方法和應用。 一、Python實現人名最多數統計的基礎 1、首先,我們需要了解Python語言的一些基礎知識,如列表、字…

    編程 2025-04-28

發表回復

登錄後才能評論