首頁
vcpkg
構建JSON-C 實作了引用計數物件模型,讓您可以輕鬆地用 C 語言建構 JSON 對象,將它們輸出為 JSON 格式的字串,並將 JSON 格式的字串解析回 JSON 物件的 C 表示形式。它旨在符合 RFC 8259。
如果您已安裝 json-c 並準備使用,請跳到使用 json-c 或檢視 API 文件。
json-c 的首頁:https://github.com/json-c/json-c/wiki
如果您對使用 json-c 有疑問,請在我們的論壇上提出主題:https://groups.google.com/forum/#!forum/json-c
如果您認為自己發現了錯誤,請在 (https://github.com/json-c/json-c/issues) 報告。請務必提供您正在使用的 json-c 版本、您正在執行的作業系統以及任何其他相關詳細資訊。非常感謝完全可重現的測試案例和/或修復問題的補丁。
錯誤修復或小的新功能可以直接作為拉取請求提交。對於主要的新功能或任何類型的重大更改,請先在論壇上開始討論。
git
、 gcc
和cmake
在 Unix 上構建如果您已經安裝了 json-c,請參閱連結至libjson-c
以了解如何建置和連結您的程式。
建置狀態
測試狀態
gcc
、 clang
或其他 C 編譯器
cmake>=2.8
, >=3.16
推薦, cmake=>3.1
用於測試
要產生文檔,您還需要:
doxygen>=1.8.13
如果您使用的是相對現代的系統,您可能能夠使用作業系統的打包系統安裝先決條件。
sudo apt install git
sudo apt install cmake
sudo apt install doxygen # optional
sudo apt install valgrind # optional
json-c
GitHub 儲存庫:https://github.com/json-c/json-c
$ git clone https://github.com/json-c/json-c.git
$ mkdir json-c-build
$ cd json-c-build
$ cmake ../json-c # See CMake section below for custom arguments
注意:也可以將建置目錄放在 json-c 來源目錄中,甚至完全不使用單獨的建置目錄,但某些事情可能無法正常運作(特別是make distcheck
)
然後:
$ make
$ make test
$ make USE_VALGRIND=0 test # optionally skip using valgrind
$ sudo make install # it could be necessary to execute make install
庫文檔可以使用 Doxygen 工具直接從原始碼產生:
# in build directory
make doc
google-chrome doc/html/index.html
json-c 函式庫是使用 CMake 建構的,它可以採用一些選項。
多變的 | 類型 | 描述 |
---|---|---|
CMAKE_INSTALL_PREFIX | 細繩 | 安裝位置。 |
CMAKE_BUILD_TYPE | 細繩 | 預設為“調試”。 |
BUILD_SHARED_LIBS | 布林 | 預設建置生成動態(dll/so)庫。將其設為 OFF 僅建立靜態庫。 |
BUILD_STATIC_LIBS | 布林 | 預設建置生成靜態 (lib/a) 函式庫。將其設為 OFF 僅建立共用庫。 |
DISABLE_STATIC_FPIC | 布林 | 預設建置位置無關的程式碼。將其設為 OFF 僅建立共用庫。 |
DISABLE_BSYMBOLIC | 布林 | 停用 -Bsymbolic-functions 的使用。 |
DISABLE_THREAD_LOCAL_STORAGE | 布林 | 停用線程本地存儲 (HAVE___THREAD)。 |
DISABLE_WERROR | 布林 | 停用 -Werror 的使用。 |
DISABLE_EXTRA_LIBS | 布林 | 禁止使用額外的庫 libbsd |
DISABLE_JSON_POINTER | 布林 | 在建置中省略 json_pointer 支援。 |
啟用_RDRAND | 布林 | 啟用 RDRAND 硬體 RNG 哈希種子。 |
啟用_線程 | 布林 | 啟用部分線程支援。 |
OVERRIDE_GET_RANDOM_SEED | 細繩 | 用於取代 json_c_get_random_seed() 的預設實作的程式碼區塊,例如在甚至無法回退到 time() 的嵌入式平台上。必須是單行。 |
在 CMake 命令列上將這些選項作為-D
傳遞。
# build a static library only
cmake -DBUILD_SHARED_LIBS=OFF ..
儘管 json-c 不支援對物件樹的完全多線程訪問,但它有一些程式碼可以幫助使其在線程程式中使用更安全。目前,這僅限於對 json_object_get() 和 json_object_put() 使用原子操作。
由於這可能會對效能產生影響,根據 https://stackoverflow.com/a/11609063 至少慢 3 倍,因此預設會停用它。您可以透過調整 cmake 指令來開啟它:-DENABLE_THREADING=ON
另外,用於物件欄位鍵的預設雜湊函數 lh_char_hash 使用比較和交換操作來確保隨機種子僅產生一次。因為這是一次性操作,所以它總是在比較和交換操作可用時編譯。
對於熟悉舊的 autoconf/autogen.sh/configure 方法的人來說,有一個cmake-configure
包裝腳本可以輕鬆過渡到 cmake。
mkdir build
cd build
../cmake-configure --prefix=/some/install/path
make
cmake-configure 可以採用一些選項。
選項 | 描述 |
---|---|
前綴=前綴 | 在 PREFIX 中安裝與體系結構無關的文件 |
啟用執行緒 | 使程式碼支援部分多執行緒使用 |
啟用rdrand | 在支援的 x86/x64 平台上啟用 RDRAND 硬體 RNG 哈希種子產生。 |
啟用共享 | 建構共享庫[預設=是] |
啟用靜態 | 建構靜態庫[預設=是] |
禁用-Bsymbolic | 避免與 -Bsymbolic-function 鏈接 |
停用錯誤 | 避免將編譯器警告視為致命錯誤 |
預設情況下,如果 valgrind 可用,則執行測試會使用它。這會大大減慢測試速度,因此要停用它,請使用:
export USE_VALGRIND=0
要運行測試,建議使用單獨的建置目錄:
mkdir build-test
cd build-test
# VALGRIND=1 causes -DVALGRIND=1 to be passed when compiling code
# which uses slightly slower, but valgrind-safe code.
VALGRIND=1 cmake ..
make
make test
# By default, if valgrind is available running tests uses it.
make USE_VALGRIND=0 test # optionally skip using valgrind
如果測試失敗,請檢查Testing/Temporary/LastTest.log
、 tests/testSubDir/${testname}/${testname}.vg.out
和其他類似檔案。如果輸出不足嘗試:
VERBOSE=1 CTEST_OUTPUT_ON_FAILURE=1 make test
或者
JSONC_TEST_TRACE=1 make test
並再次檢查日誌檔。
vcpkg
在 Unix 和 Windows 上構建您可以使用 vcpkg 依賴項管理器下載並安裝 JSON-C:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install json-c
vcpkg 中的 JSON-C 連接埠由 Microsoft 團隊成員和社群貢獻者保持最新。如果版本已過時,請在 vcpkg 儲存庫上建立問題或拉取要求。
現在,在 Android 上建置得到了特別好的支持,但也有一些使用 https://developer.android.com/ndk/guides/cmake 取得成功的報告
mkdir json-c-build
cd json-c-build/
export NDK_HOME=~/Library/Android/sdk/ndk/22.1.7171670/
cmake
--toolchain=$NDK_HOME/build/cmake/android.toolchain.cmake
-DANDROID_STL=none
-DANDROID_ABI=arm64-v8a
-DANDROID_PLATFORM=android-29
-DANDROID_LD=lld
-DCMAKE_BUILD_TYPE=MinSizeRel
-DCMAKE_INSTALL_PREFIX=<install prefix>
-DENABLE_THREADING=true
..
make install
libjson-c
如果您的系統有pkgconfig
,那麼您可以將其新增至makefile
:
CFLAGS += $( shell pkg-config --cflags json-c)
LDFLAGS += $( shell pkg-config --libs json-c)
如果沒有pkgconfig
,您可能會執行以下操作:
JSON_C_DIR =/path/to/json_c/install
CFLAGS += -I $( JSON_C_DIR ) /include/json-c
# Or to use lines like: #include <json-c/json_object.h>
# CFLAGS += -I$(JSON_C_DIR)/include
LDFLAGS+ = -L $( JSON_C_DIR ) /lib -ljson-c
如果您的專案使用 cmake:
find_package (json-c CONFIG)
target_link_libraries ( ${PROJECT_NAME} PRIVATE json-c::json-c)
cd build
cmake -DCMAKE_PREFIX_PATH=/path/to/json_c/install/lib64/cmake ..
要使用 json-c,您可以包含 json.h,或者最好包含以下更具體的頭檔之一:
json_object_object_foreach()
)有關標頭的完整列表,請參閱 files.html
json-c 中的主要類型是 json_object。 json_tokener_parse_ex()
json_object_new_object()
json_object_new_int()
json_object_object_add()
json_object_array_add()
等...) 分別。通常,樹中的每個物件都會有一個來自其父物件的參考。當您處理完物件樹後,您可以只在根物件上呼叫 json_object_put() 來釋放它,這會向下遞歸到所有子對象,依序對每個物件呼叫 json_object_put() 。
您可以取得單一子物件的參考( json_object_object_get()
或json_object_array_get_idx()
),並在其父物件有效時使用該物件。
如果您需要子物件的生存時間比其父物件長,則可以增加子物件的參考計數( json_object_get()
),以使其能夠在父物件釋放或從其父物件中刪除( json_object_object_del()
或json_object_array_del_idx()
)時繼續存在
解析文字時,json_tokener 物件與其傳回的 json_object 無關。它可以被指派( json_tokener_new()
)一次或使用多次( json_tokener_parse_ex()
,並在 json_object 物件存在時釋放( json_tokener_free()
)。
可以使用json_object_to_json_string_ext()
將 json_object 樹序列化回字串。傳回的字串僅在同一物件上的下一個“to_json_string”呼叫之前有效。此外,當 json_object 被釋放時,它也會被釋放。