主页
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 对象的引用计数树,这些对象是通过使用 json_tokener (即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 被释放时,它也会被释放。