10.23 C語言的JSON庫Jansson

Jansson概述

Jansson是一個C語言庫,用於編碼,解碼和處理JSON數據。其主要特點和設計原則是:

  • 簡單直觀的API和數據模型
  • 全面的文檔
  • 不依賴其他庫
  • 完全支持Unicode(UTF-8)
  • 廣泛的測試套件

Jansson的API穩定可靠,可廣泛應用於生產中。它可以在多種平臺上運行,包括多種類Unix系統和Windows。它適用於任何系統,包括臺式機,服務器和小型嵌入式系統。Jansson是以MIT協議授權的。

編譯和安裝Jansson

解壓源碼

bunzip2 -c jansson-2.12.tar.bz2 | tar xf -
cd jansson-2.12

源代碼使用GNU Autotools(autoconf,automake,libtool),因此編譯和安裝非常簡單。

./configure
make
make check
make install

要更改目標目錄(默認情況下為/usr/local),可將--prefix=dir參數用於./configure。可參閱./configure--help以獲取所有可能的配置選項的列表。

make check命令運行jansson發佈的測試套件。這一步並不是絕對必要的,但它可能會發現jansson在你的平臺上可能存在的問題。

如果您從git存儲庫(或任何其他源代碼管理系統)獲得源代碼,則不會有./configure腳本,因為它不保存在版本控制中。要創建腳本,需要引導生成系統。可通過執行如下命令。

autoreconf -fi

此命令創建./configure腳本,然後可以如上面描述的使用該腳本編譯jansson。

線程安全性

Jansson作為一個庫是線程安全的,並且沒有可變的全局狀態。Jansson的代碼內沒有執行鎖定。 對多個線程共享的JSON值進行只讀訪問是安全的,但對多個線程共享的JSON值進行更改則不可行。如果多個線程共享的JSON值發生突變,則多線程程序必須執行其自身的鎖定。但是,

引用計數操作json_incref()json_decref())通常是線程安全的,並且可以在線程之間共享的JSON值上執行。可以使用JANSSON_THREAD_SAFE_REFCOUNT預處理器常數檢查引用計數的線程安全性 。線程安全的引用計數操作是使用編譯器內置的原子函數實現的,該函數在大多數現代編譯器中都可用。如果沒有編譯器支持(JANSSON_THREAD_SAFE_REFCOUNT 未定義),則可能很難確保引用計數的線程安全性。

API參考

所有聲明都在中jansson.h,因此應用需要包含jansson.h頭文件。

#include <jansson.h>
/<jansson.h>

所有常量都帶有前綴JSON_(描述庫版本的常量除外,帶有前綴JANSSON_)。其他標識符以json_開頭。

庫版本

Jansson版本的格式為ABC,其中A是主要版本,B是次要版本,

C是微型版本。如果微版本為零,則從版本字符串中將其省略,即版本字符串僅為AB。當新版本僅修復錯誤且未添加新功能時,微型版本會增加。當以向後兼容的方式添加新功能時,次要版本會增加,而微型版本會設置為零。當存在向後不兼容的更改時,主版本會增加,其他版本會設置為零。以下預處理程序常量指定庫的當前版本:

JANSSON_MAJOR_VERSION,JANSSON_MINOR_VERSION,JANSSON_MICRO_VERSION

以上宏分別指定主要版本,次要版本和微型版本,其值為整型。

JANSSON_VERSION

當前版本的字符串表示形式,例如"1.2.1"或 "1.3"。

JANSSON_VERSION_HEX

版本的3字節十六進制表示形式,例如 0x010201版本1.2.1和0x010300版本1.3。這在數字比較中很有用,例如:

#if JANSSON_VERSION_HEX >= 0x010300
/* Code specific to version 1.3 and above */
#endif

JANSSON_THREAD_SAFE_REFCOUNT

如果定義了此值,則Jansson中的所有隻讀操作和引用計數都是線程安全的。對於早於2.11或在編譯器未提供內置原子函數的版本中未定義此值 。詳細的API可參考https://jansson.readthedocs.io/en/2.12/apiref.html

以下代碼創建一個新的JSON數組,併為其添加一個整數:

json_t *array, *integer;
array = json_array();
integer = json_integer(42);
json_array_append(array, integer);
json_decref(integer);


分享到:


相關文章: