mainpage
vcpkg
JSON-C implementiert ein Referenzzählobjektmodell, mit dem Sie JSON-Objekte einfach in C erstellen, als JSON-formatierte Zeichenfolgen ausgeben und JSON-formatierte Zeichenfolgen zurück in die C-Darstellung von JSON-Objekten analysieren können. Ziel ist die Konformität mit RFC 8259.
Fahren Sie mit „Json-c verwenden“ fort oder schauen Sie sich die API-Dokumente an, wenn Sie json-c bereits installiert und einsatzbereit haben.
Homepage für json-c: https://github.com/json-c/json-c/wiki
Wenn Sie Fragen zur Verwendung von json-c haben, starten Sie bitte einen Thread in unseren Foren unter: https://groups.google.com/forum/#!forum/json-c
Wenn Sie glauben, einen Fehler entdeckt zu haben, melden Sie ihn unter (https://github.com/json-c/json-c/issues). Bitte geben Sie unbedingt die von Ihnen verwendete JSON-C-Version, das Betriebssystem, auf dem Sie ausgeführt werden, und alle anderen relevanten Details an. Vollständig reproduzierbare Testfälle und/oder Patches zur Behebung von Problemen werden sehr geschätzt.
Fehlerbehebungen für Fehler oder kleine neue Features können direkt als Pull-Request eingereicht werden. Für größere neue Funktionen oder große Änderungen jeglicher Art starten Sie bitte zunächst eine Diskussion in den Foren.
git
, gcc
und cmake
Wenn Sie json-c bereits installiert haben, lesen Sie unter „Verknüpfen mit libjson-c
nach, wie Sie Ihr Programm damit erstellen und verknüpfen.
Build-Status
Teststatus
gcc
, clang
oder ein anderer C-Compiler
cmake>=2.8
, >=3.16
empfohlen, cmake=>3.1
für Tests
Zum Generieren von Dokumenten benötigen Sie außerdem:
doxygen>=1.8.13
Wenn Sie ein relativ modernes System verwenden, können Sie die Voraussetzungen wahrscheinlich mithilfe des Paketsystems Ihres Betriebssystems installieren.
sudo apt install git
sudo apt install cmake
sudo apt install doxygen # optional
sudo apt install valgrind # optional
json-c
GitHub-Repo: 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
Hinweis: Es ist auch möglich, Ihr Build-Verzeichnis im json-c-Quellverzeichnis abzulegen oder überhaupt kein separates Build-Verzeichnis zu verwenden, aber bestimmte Dinge funktionieren möglicherweise nicht ganz richtig (insbesondere make distcheck
).
Dann:
$ make
$ make test
$ make USE_VALGRIND=0 test # optionally skip using valgrind
$ sudo make install # it could be necessary to execute make install
Die Bibliotheksdokumentation kann mit dem Doxygen-Tool direkt aus dem Quellcode generiert werden:
# in build directory
make doc
google-chrome doc/html/index.html
Die json-c-Bibliothek wird mit CMake erstellt, das einige Optionen annehmen kann.
Variable | Typ | Beschreibung |
---|---|---|
CMAKE_INSTALL_PREFIX | Zeichenfolge | Der Installationsort. |
CMAKE_BUILD_TYPE | Zeichenfolge | Der Standardwert ist „debug“. |
BUILD_SHARED_LIBS | Bool | Der Standard-Build generiert eine dynamische Bibliothek (dll/so). Setzen Sie dies auf AUS, um nur eine statische Bibliothek zu erstellen. |
BUILD_STATIC_LIBS | Bool | Der Standard-Build generiert eine statische Bibliothek (lib/a). Setzen Sie dies auf AUS, um nur eine gemeinsam genutzte Bibliothek zu erstellen. |
DISABLE_STATIC_FPIC | Bool | Standardmäßig wird positionsunabhängiger Code erstellt. Setzen Sie dies auf AUS, um nur eine gemeinsam genutzte Bibliothek zu erstellen. |
DISABLE_BSYMBOLIC | Bool | Deaktivieren Sie die Verwendung von -Bsymbolic-functions. |
DISABLE_THREAD_LOCAL_STORAGE | Bool | Deaktivieren Sie die Verwendung von Thread-Local Storage (HAVE___THREAD). |
DISABLE_WERROR | Bool | Deaktivieren Sie die Verwendung von -Werror. |
DISABLE_EXTRA_LIBS | Bool | Deaktivieren Sie die Verwendung zusätzlicher Bibliotheken, libbsd |
DISABLE_JSON_POINTER | Bool | Lassen Sie die json_pointer-Unterstützung im Build weg. |
ENABLE_RDRAND | Bool | Aktivieren Sie RDRAND Hardware RNG Hash Seed. |
ENABLE_THREADING | Bool | Aktivieren Sie die teilweise Threading-Unterstützung. |
OVERRIDE_GET_RANDOM_SEED | Zeichenfolge | Ein Codeblock, der anstelle der Standardimplementierung von json_c_get_random_seed() verwendet werden soll, z. B. auf eingebetteten Plattformen, auf denen nicht einmal der Fallback auf time() funktioniert. Muss eine einzelne Zeile sein. |
Übergeben Sie diese Optionen als -D
in der Befehlszeile von CMake.
# build a static library only
cmake -DBUILD_SHARED_LIBS=OFF ..
Obwohl json-c keinen vollständigen Multithread-Zugriff auf Objektbäume unterstützt, verfügt es über Code, der die Verwendung in Thread-Programmen etwas sicherer macht. Derzeit ist dies auf die Verwendung atomarer Operationen für json_object_get() und json_object_put() beschränkt.
Da dies Auswirkungen auf die Leistung haben kann (laut https://stackoverflow.com/a/11609063 mindestens dreimal langsamer), ist es standardmäßig deaktiviert. Sie können es aktivieren, indem Sie Ihren cmake-Befehl mit -DENABLE_THREADING=ON anpassen
Unabhängig davon verwendet die Standard-Hash-Funktion lh_char_hash, die für Objektfeldschlüssel verwendet wird, eine Vergleichs- und Austauschoperation, um sicherzustellen, dass der zufällige Startwert nur einmal generiert wird. Da es sich um einen einmaligen Vorgang handelt, wird er immer dann kompiliert, wenn der Vergleichs- und Austauschvorgang verfügbar ist.
Für diejenigen, die mit der alten Methode autoconf/autogen.sh/configure vertraut sind, gibt es ein Wrapper-Skript cmake-configure
um den Übergang zu cmake zu erleichtern.
mkdir build
cd build
../cmake-configure --prefix=/some/install/path
make
cmake-configure kann einige Optionen annehmen.
Optionen | Beschreibung |
---|---|
Präfix=PREFIX | Architekturunabhängige Dateien in PREFIX installieren |
Threading aktivieren | Aktivieren Sie den Code, um die teilweise Multithread-Nutzung zu unterstützen |
enable-rdrand | Aktivieren Sie die RDRAND-Hardware-RNG-Hash-Seed-Generierung auf unterstützten x86/x64-Plattformen. |
enable-shared | Gemeinsam genutzte Bibliotheken erstellen [default=yes] |
aktivieren-statisch | Statische Bibliotheken erstellen [Standard=Ja] |
deaktivieren-Bsymbolisch | Vermeiden Sie die Verknüpfung mit -Bsymbolic-function |
Disable-Fehler | Vermeiden Sie es, Compiler-Warnungen als schwerwiegende Fehler zu behandeln |
Standardmäßig wird Valgrind beim Ausführen von Tests verwendet, wenn es verfügbar ist. Dies kann die Tests erheblich verlangsamen. Um es zu deaktivieren, verwenden Sie Folgendes:
export USE_VALGRIND=0
Zum Ausführen von Tests wird ein separates Build-Verzeichnis empfohlen:
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
Wenn ein Test fehlschlägt, überprüfen Sie Testing/Temporary/LastTest.log
, tests/testSubDir/${testname}/${testname}.vg.out
und andere ähnliche Dateien. Wenn die Ausgabe nicht ausreicht, versuchen Sie Folgendes:
VERBOSE=1 CTEST_OUTPUT_ON_FAILURE=1 make test
oder
JSONC_TEST_TRACE=1 make test
und überprüfen Sie die Protokolldateien erneut.
vcpkg
Sie können JSON-C mit dem vcpkg-Abhängigkeitsmanager herunterladen und installieren:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install json-c
Der JSON-C-Port in vcpkg wird von Microsoft-Teammitgliedern und Community-Mitwirkenden auf dem neuesten Stand gehalten. Wenn die Version veraltet ist, erstellen Sie bitte einen Issue oder Pull Request im vcpkg-Repository.
Das Erstellen auf Android wird mittlerweile besonders gut unterstützt, es gibt jedoch einige Erfolgsberichte mit 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
Wenn Ihr System über pkgconfig
verfügt, können Sie dies einfach zu Ihrem makefile
hinzufügen:
CFLAGS += $( shell pkg-config --cflags json-c)
LDFLAGS += $( shell pkg-config --libs json-c)
Ohne pkgconfig
könnten Sie etwa Folgendes tun:
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
Wenn Ihr Projekt cmake verwendet:
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 ..
Um json-c zu verwenden, können Sie entweder json.h oder vorzugsweise eine der folgenden spezifischeren Header-Dateien einbinden:
json_object_object_foreach()
in json_object.h)Eine vollständige Liste der Header finden Sie unter files.html
Der primäre Typ in json-c ist json_object. Es beschreibt einen referenzgezählten Baum von JSON-Objekten, die entweder durch Parsen von Text mit einem json_tokener (d. h. json_tokener_parse_ex()
) oder durch Erstellen (mit json_object_new_object()
, json_object_new_int()
usw.) und Hinzufügen (mit json_object_object_add()
, json_object_array_add()
usw.) sie einzeln. Normalerweise verfügt jedes Objekt im Baum über eine Referenz von seinem übergeordneten Objekt. Wenn Sie mit dem Baum der Objekte fertig sind, rufen Sie json_object_put() nur für das Stammobjekt auf, um es freizugeben, was nach unten durch alle untergeordneten Objekte geht, die nacheinander json_object_put() für jedes dieser Objekte aufrufen.
Sie können einen Verweis auf ein einzelnes untergeordnetes Objekt ( json_object_object_get()
oder json_object_array_get_idx()
) erhalten und dieses Objekt verwenden, solange sein übergeordnetes Objekt gültig ist.
Wenn Sie möchten, dass ein untergeordnetes Objekt länger lebt als sein übergeordnetes Objekt, können Sie den Refcount des untergeordneten Objekts erhöhen ( json_object_get()
), damit es überlebt, wenn das übergeordnete Objekt freigegeben oder von seinem übergeordneten Objekt entfernt wird ( json_object_object_del()
oder json_object_array_del_idx()
).
Beim Parsen von Text ist das json_tokener-Objekt unabhängig vom zurückgegebenen json_object. Es kann zugewiesen ( json_tokener_new()
), ein- oder mehrmals verwendet ( json_tokener_parse_ex()
und freigegeben ( json_tokener_free()
) werden, während die json_object-Objekte weiterleben.
Ein json_object-Baum kann mit json_object_to_json_string_ext()
wieder in einen String serialisiert werden. Die zurückgegebene Zeichenfolge ist nur bis zum nächsten „to_json_string“-Aufruf für dasselbe Objekt gültig. Außerdem wird es freigegeben, wenn das json_object freigegeben wird.