главная страница
vcpkg
JSON-C реализует объектную модель подсчета ссылок, которая позволяет легко создавать объекты JSON на C, выводить их в виде строк в формате JSON и анализировать строки в формате JSON обратно в представление C объектов JSON. Он стремится соответствовать RFC 8259.
Перейдите к разделу «Использование json-c» или ознакомьтесь с документацией по API, если json-c у вас уже установлен и готов к использованию.
Домашняя страница 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
Если у вас уже установлен 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, чтобы создать только общую библиотеку. |
ОТКЛЮЧИТЬ_BSYMBOLIC | Бул | Отключите использование -Bsymbolic-функций. |
DISABLE_THREAD_LOCAL_STORAGE | Бул | Отключите использование локального хранилища потоков (HAVE___THREAD). |
ОТКЛЮЧИТЬ_WERROR | Бул | Отключите использование -Werror. |
DISABLE_EXTRA_LIBS | Бул | Отключите использование дополнительных библиотек libbsd. |
DISABLE_JSON_POINTER | Бул | Исключить поддержку json_pointer из сборки. |
ENABLE_RDRAND | Бул | Включите RDRAND Hardware RNG Hash Seed. |
ENABLE_THREADING | Бул | Включить частичную поддержку потоков. |
OVERRIDE_GET_RANDOM_SEED | Нить | Блок кода, который можно использовать вместо реализации json_c_get_random_seed() по умолчанию, например, на встроенных платформах, где не работает даже запасной вариант time(). Должно быть одной строкой. |
Передайте эти параметры как -D
в командной строке CMake.
# build a static library only
cmake -DBUILD_SHARED_LIBS=OFF ..
Хотя json-c не поддерживает полностью многопоточный доступ к деревьям объектов, в нем есть код, который делает его использование в многопоточных программах более безопасным. В настоящее время это ограничивается использованием атомарных операций для json_object_get() и json_object_put().
Поскольку это может повлиять на производительность как минимум в 3 раза медленнее, согласно https://stackoverflow.com/a/11609063, по умолчанию оно отключено. Вы можете включить его, изменив команду 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 | Включите аппаратную генерацию начального числа хэша RNG RDRAND на поддерживаемых платформах x86/x64. |
включить общий доступ | создавать общие библиотеки [по умолчанию = да] |
включить-статический | создавать статические библиотеки [по умолчанию = да] |
отключить-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
Вы можете загрузить и установить JSON-C с помощью менеджера зависимостей vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install json-c
Порт JSON-C в vcpkg постоянно обновляется членами команды 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()
в json_object.h)Полный список заголовков см. в 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_tokener_free()
), пока объекты json_object продолжают существовать.
Дерево json_object можно сериализовать обратно в строку с помощью json_object_to_json_string_ext()
. Возвращаемая строка действительна только до следующего вызова to_json_string для того же объекта. Кроме того, он освобождается при освобождении json_object.