/ json-c

mainpage

  1. Обзор и статус сборки
  2. Создание на Unix
    • Предварительные требования
    • Команды сборки
  3. Параметры CMake
  4. Тестирование
  5. Сборка с помощью vcpkg
  6. Связывание с libjson-c
  7. Использование json-c

JSON -C — Реализация JSON в C

Статус сборки

  • AppVeyor Build
  • Сборка Трэвиса

Состояние теста

  • Комбинезоны

JSON-C реализует объектную модель подсчета ссылок, которая позволяет легко создавать объекты JSON в C, выводить их в виде строк в формате JSON и анализировать строки в формате JSON обратно в представление C объектов JSON. Он нацелен на соответствие RFC 7159.

Создание на Unix с помощью git , gcc и cmake

Домашняя страница для json-c: https://github.com/json-c/json-c/wiki

Предварительные требования:

  • gcc , clang или другой компилятор C

  • cmake> = 2.8 , > = 3.16 рекомендуется

Для создания документов вам также потребуется:

  • doxygen>=1.8.13

Если вы используете относительно современную систему, вы, вероятно, сможете установить предварительные условия с использованием системы упаковки вашей ОС.

Установить с помощью apt (например, Ubuntu 16.04.2 LTS)

 sudo apt install gitsudo apt install cmakesudo apt install doxygen # optionalsudo 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 # См.  Раздел CMake ниже для настраиваемых аргументов 

Примечание: также можно поместить каталог сборки в каталог json-csource или даже не использовать отдельный каталог сборки вообще, но некоторые вещи могут работает не совсем правильно (в частности, make distcheck )

Затем:

 $ make $ make test $  make USE_VALGRIND = 0 test # опционально пропустить использование valgrind $ make install 

Создание документации с помощью Doxygen:

Документация библиотеки может быть создана непосредственно из источника код с использованием инструмента Doxygen:

 # в каталоге сборки создать документ  google-chrome doc/html/index.html 

Параметры CMake

Библиотека json-c построена с помощью CMake, который может принимать несколько параметров .

Переменная Тип Описание
CMAKE_INSTALL_PREFIX String Место установки.
CMAKE_BUILD_TYPE String По умолчанию «отладка».
BUILD_SHARED_LIBS Bool Сборка по умолчанию генерирует динамическую (dll/so) библиотеку . Установите для этого параметра значение OFF, чтобы создать только статическую библиотеку.
BUILD_STATIC_LIBS Bool сборка по умолчанию генерирует статическую (lib/a) библиотеку. Установите значение OFF для создания только общей библиотеки.
DISABLE_STATIC_FPIC Bool по умолчанию строит независимый от позиции код. Установите значение OFF, чтобы создать только общую библиотеку.
DISABLE_BSYMBOLIC Bool Disable использование -Bsymbolic-функций.
DISABLE_THREAD_LOCAL_STORAGE Bool Отключить использование Thread- Локальное хранилище (HAVE___THREAD).
DISABLE_WERROR Bool Отключить использование -Werror.
ENABLE_RDRAND Bool Включить аппаратное начальное значение Hash Seed RDRAND.
ENABLE_THREADING Bool Включить поддержку частичной потоковой передачи.
OVERRIDE_GET_RANDOM_SEED String Блок кода, который следует использовать вместо стандартной реализации json_c_get_random_seed (), например на встроенных платформах, где не работает даже откат на time (). Должен быть одной строкой.

Передайте эти параметры как -D в командной строке CMake.

 # построить только статическую библиотеку 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, использует операцию сравнения и замены, чтобы гарантировать randomseed генерируется только один раз. Поскольку это одноразовая операция, она всегда компилируется, когда доступна операция сравнения и замены.

сценарий оболочки cmake-configure

Для тех, кто знаком со старым методом autoconf/autogen.sh/configure существует сценарий оболочки cmake-configure для облегчения перехода на cmake.

  mkdir buildcd build ../cmake-configure --prefix =/some/install/pathmake 

cmake-configure может принимать несколько параметров.

options Описание
prefix = PREFIX установить независимые от архитектуры файлы в PREFIX
включить -threading Включить код для поддержки частично многопоточного использования
enable-rdrand Включите аппаратную генерацию Hash Seed RDRAND на поддерживаемых платформах x86/x64.
enable-shared build shared libraries [default = да]
enable-static создавать статические библиотеки [default = yes]
disable-Bsymbolic Избегайте связывания с -Bsymbolic-function
disable-werror Избегайте обработки предупреждений компилятора как фатальных ошибок

Тестирование:

По умолчанию, если valgrind доступен для запуска тестов, использует его. Это может значительно замедлить тесты, поэтому для его отключения используйте:

 export USE_VALGRIND = 0 

Для запуска тестов отдельный буй ld рекомендуется:

 mkdir build-testcd build-test # VALGRIND = 1 вызывает передачу -DVALGRIND = 1 при компиляции кода #, который использует немного медленнее, но valgrind-  безопасный код. VALGRIND = 1 cmake ..makemake test # По умолчанию, если доступен valgrind, запущенные тесты используют его. make USE_VALGRIND = 0 test # опционально пропустить использование valgrind 

Если тест не удается, проверьте Testing/Temporary/LastTest.log , tests/testSubDir/$ {testname}/$ {testname} .vg.out и другие подобные Если выходных файлов недостаточно, попробуйте:

 VERBOSE = 1 make test 

или

 JSONC_TEST_TRACE = 1 make test 

и снова проверьте файлы журнала.

Сборка на Unix и Windows с помощью vcpkg

Вы можете загрузить и установить JSON-C с помощью диспетчера зависимостей vcpkg:

  git clone https://github  .com/Microsoft/vcpkg.gitcd vcpkg./bootstrap-vcpkg.sh./vcpkg интегрировать installvcpkg install json-c  

Порт JSON-C в vcpkg поддерживается в актуальном состоянии членами группы Microsoft и участниками сообщества. Если версия устарела, создайте проблему или запрос на вытягивание в репозитории vcpkg.

Ссылка на libjson-c

Если в вашей системе есть pkgconfig , вы можете просто добавить это в свой makefile :

  CFLAGS + = $ (оболочка pkg-config --cflags json-c) LDFLAGS + = $ (оболочка pkg-config --libs json-c) 

Без pkgconfig , вы должны сделать что-то вроде этого:

 JSON_C_DIR =/path/to/json_c/installCFLAGS + = -I $ (JSON_C_DIR)/include/json  -cLDFLAGS + = -L $ (JSON_C_DIR)/lib -ljson-c 

Использование json-c

Чтобы использовать json-c, вы можете либо включить json.h или, желательно, один из следующих более конкретных файлов заголовков:

  • json_object.h — основные типы и методы.
  • json_tokener.h — Методы синтаксического анализа и сериализации деревьев объектов json-c.
  • json_pointer. h — реализация указателя JSON (RFC 6901) для извлечения объектов из дерева объектов json-c.
  • json_object_iterator.h — методы для итерации по отдельным экземплярам json_object. (См. Также json_object_object_foreach () в json_object.h)
  • json_visit.h — Методы обхода дерева объектов json-c.
  • json_util.h — Разные служебные функции.

Полный список заголовков см. files.html

Основной тип в json-c это json_object. Он описывает дерево счетчиков ссылок json-объектов, которые создаются либо путем анализа текста с помощью ajson_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 () ) и использовать этот объект, пока его родительский объект действителен.
Если вам нужно, чтобы дочерний объект жил дольше, чем его родительский, вы можете увеличить refcount дочернего ( json_object_get () ) на позволить ему пережить освобождение родителя или его удаление из родителя ( json_object_object_del () или json_object_array_del_idx () )

При синтаксическом анализе текста объект json_tokener не зависит от json_object, который он возвращает. Его можно выделить ( json_tokener_new () ), использовать один или несколько раз ( json_tokener_parse_ex () иfreed ( json_tokener_free () ), пока существуют объекты json_object.

Дерево json_object можно сериализовать обратно в строку с помощью json_object_to_json_string_ext () . Возвращаемая строка действительна только до следующий вызов to_json_string для того же объекта. Кроме того, он освобождается, когда освобождается json_object.

Оцените статью
techsly.ru
Добавить комментарий