page principale
vcpkg
JSON-C implémente un modèle d'objet de comptage de références qui vous permet de construire facilement des objets JSON en C, de les générer sous forme de chaînes au format JSON et d'analyser les chaînes au format JSON dans la représentation C des objets JSON. Il vise à se conformer à la RFC 8259.
Passez à Utilisation de json-c ou consultez la documentation de l'API, si json-c est déjà installé et prêt à l'emploi.
Page d'accueil de json-c : https://github.com/json-c/json-c/wiki
Si vous avez des questions sur l'utilisation de json-c, veuillez démarrer un fil de discussion sur nos forums à l'adresse : https://groups.google.com/forum/#!forum/json-c.
Si vous pensez avoir découvert un bug, signalez-le sur (https://github.com/json-c/json-c/issues). Assurez-vous d'inclure la version de json-c que vous utilisez, le système d'exploitation sur lequel vous utilisez et tout autre détail pertinent. Des cas de test et/ou des correctifs entièrement reproductibles pour résoudre les problèmes sont grandement appréciés.
Les correctifs de bugs ou les petites nouvelles fonctionnalités peuvent être directement soumis sous forme de pull request. Pour les nouvelles fonctionnalités majeures ou les changements importants de toute nature, veuillez d'abord démarrer une discussion sur les forums.
git
, gcc
et cmake
Si json-c est déjà installé, consultez Lien vers libjson-c
pour savoir comment créer et lier votre programme à celui-ci.
Statut de construction
Statut des tests
gcc
, clang
ou un autre compilateur C
cmake>=2.8
, >=3.16
recommandé, cmake=>3.1
pour les tests
Pour générer des documents, vous aurez également besoin de :
doxygen>=1.8.13
Si vous utilisez un système relativement moderne, vous pourrez probablement installer les prérequis à l'aide du système de packaging de votre système d'exploitation.
sudo apt install git
sudo apt install cmake
sudo apt install doxygen # optional
sudo apt install valgrind # optional
json-c
dépôt 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
Remarque : il est également possible de placer votre répertoire de construction dans le répertoire source json-c, ou même de ne pas utiliser de répertoire de construction séparé du tout, mais certaines choses peuvent ne pas fonctionner correctement (notamment make distcheck
)
Alors:
$ make
$ make test
$ make USE_VALGRIND=0 test # optionally skip using valgrind
$ sudo make install # it could be necessary to execute make install
La documentation de la bibliothèque peut être générée directement à partir du code source à l'aide de l'outil Doxygen :
# in build directory
make doc
google-chrome doc/html/index.html
La bibliothèque json-c est construite avec CMake, qui peut prendre quelques options.
Variable | Taper | Description |
---|---|---|
CMAKE_INSTALL_PREFIX | Chaîne | L'emplacement d'installation. |
CMAKE_BUILD_TYPE | Chaîne | La valeur par défaut est "déboguer". |
BUILD_SHARED_LIBS | Booléen | La version par défaut génère une bibliothèque dynamique (dll/so). Réglez ceci sur OFF pour créer uniquement une bibliothèque statique. |
BUILD_STATIC_LIBS | Booléen | La version par défaut génère une bibliothèque statique (lib/a). Réglez ceci sur OFF pour créer uniquement une bibliothèque partagée. |
DISABLE_STATIC_FPIC | Booléen | Le code indépendant de la position est construit par défaut. Réglez ceci sur OFF pour créer uniquement une bibliothèque partagée. |
DISABLE_BSYMBOLIC | Booléen | Désactivez l'utilisation des fonctions symboliques -B. |
DISABLE_THREAD_LOCAL_STORAGE | Bool | Désactivez l’utilisation du stockage Thread-Local (HAVE___THREAD). |
DISABLE_WERROR | Booléen | Désactivez l'utilisation de -Werror. |
DISABLE_EXTRA_LIBS | Booléen | Désactiver l'utilisation de bibliothèques supplémentaires, libbsd |
DISABLE_JSON_POINTER | Booléen | Omettez la prise en charge de json_pointer de la version. |
ENABLE_RDRAND | Booléen | Activez la graine de hachage RNG matérielle RDRAND. |
ENABLE_THREADING | Booléen | Activer la prise en charge des threads partiels. |
OVERRIDE_GET_RANDOM_SEED | Chaîne | Un bloc de code à utiliser à la place de l'implémentation par défaut de json_c_get_random_seed(), par exemple sur les plateformes embarquées où même le repli vers time() ne fonctionne pas. Il doit s'agir d'une seule ligne. |
Transmettez ces options comme -D
sur la ligne de commande de CMake.
# build a static library only
cmake -DBUILD_SHARED_LIBS=OFF ..
Bien que json-c ne prenne pas en charge l'accès entièrement multithread aux arborescences d'objets, il contient du code pour rendre son utilisation dans les programmes threadés un peu plus sûre. Actuellement, cela se limite à l'utilisation d'opérations atomiques pour json_object_get() et json_object_put().
Étant donné que cela peut avoir un impact sur les performances, au moins 3 fois plus lent selon https://stackoverflow.com/a/11609063, il est désactivé par défaut. Vous pouvez l'activer en ajustant votre commande cmake avec : -DENABLE_THREADING=ON
Par ailleurs, la fonction de hachage par défaut utilisée pour les clés de champ d'objet, lh_char_hash, utilise une opération de comparaison et d'échange pour garantir que la graine aléatoire n'est générée qu'une seule fois. Comme il s’agit d’une opération unique, elle est toujours compilée lorsque l’opération de comparaison et d’échange est disponible.
Pour ceux qui connaissent l'ancienne méthode autoconf/autogen.sh/configure, il existe un script wrapper cmake-configure
pour faciliter la transition vers cmake.
mkdir build
cd build
../cmake-configure --prefix=/some/install/path
make
cmake-configure peut prendre quelques options.
choix | Description |
---|---|
préfixe=PREFIX | installer des fichiers indépendants de l'architecture dans PREFIX |
activer le threading | Activer le code pour prendre en charge une utilisation partiellement multithread |
activer-rdrand | Activez la génération de graines de hachage RNG matérielles RDRAND sur les plates-formes x86/x64 prises en charge. |
activer-partagé | créer des bibliothèques partagées [par défaut = oui] |
activer-statique | créer des bibliothèques statiques [par défaut = oui] |
désactiver-Bsymbolique | Évitez de créer un lien avec la fonction -Bsymbolic |
erreur de désactivation | Évitez de traiter les avertissements du compilateur comme des erreurs fatales |
Par défaut, si valgrind est disponible, les tests en cours d'exécution l'utilisent. Cela peut ralentir considérablement les tests, donc pour le désactiver, utilisez :
export USE_VALGRIND=0
Pour exécuter des tests, un répertoire de build distinct est recommandé :
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
Si un test échoue, vérifiez Testing/Temporary/LastTest.log
, tests/testSubDir/${testname}/${testname}.vg.out
et d'autres fichiers similaires. Si le résultat est insuffisant, essayez :
VERBOSE=1 CTEST_OUTPUT_ON_FAILURE=1 make test
ou
JSONC_TEST_TRACE=1 make test
et vérifiez à nouveau les fichiers journaux.
vcpkg
Vous pouvez télécharger et installer JSON-C à l'aide du gestionnaire de dépendances vcpkg :
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install json-c
Le port JSON-C dans vcpkg est tenu à jour par les membres de l'équipe Microsoft et les contributeurs de la communauté. Si la version est obsolète, veuillez créer un problème ou une pull request sur le référentiel vcpkg.
La construction sur Android est désormais particulièrement bien prise en charge, mais des rapports de réussite ont été enregistrés en utilisant 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
Si votre système dispose de pkgconfig
, vous pouvez simplement ajouter ceci à votre makefile
:
CFLAGS += $( shell pkg-config --cflags json-c)
LDFLAGS += $( shell pkg-config --libs json-c)
Sans pkgconfig
, vous pourriez faire quelque chose comme ceci :
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
Si votre projet utilise 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 ..
Pour utiliser json-c, vous pouvez soit inclure json.h, soit de préférence, l'un des fichiers d'en-tête plus spécifiques suivants :
json_object_object_foreach()
dans json_object.h)Pour une liste complète des en-têtes, voir files.html
Le type principal dans json-c est json_object. Il décrit un arbre compté de références d'objets json qui sont créés soit en analysant le texte avec un json_tokener (c'est-à-dire json_tokener_parse_ex()
), soit en créant (avec json_object_new_object()
, json_object_new_int()
, etc...) et en ajoutant (avec json_object_object_add()
, json_object_array_add()
, etc...) individuellement. En règle générale, chaque objet de l'arborescence aura une référence, provenant de son parent. Lorsque vous avez terminé avec l'arborescence des objets, vous appelez json_object_put() uniquement sur l'objet racine pour le libérer, qui se répète à travers tous les objets enfants appelant json_object_put() sur chacun d'eux à tour de rôle.
Vous pouvez obtenir une référence à un seul enfant ( json_object_object_get()
ou json_object_array_get_idx()
) et utiliser cet objet tant que son parent est valide.
Si vous avez besoin qu'un objet enfant vive plus longtemps que son parent, vous pouvez incrémenter le refcount de l'enfant ( json_object_get()
) pour lui permettre de survivre à la libération du parent ou à sa suppression de son parent ( json_object_object_del()
ou json_object_array_del_idx()
)
Lors de l'analyse du texte, l'objet json_tokener est indépendant du json_object qu'il renvoie. Il peut être alloué ( json_tokener_new()
) utilisé une ou plusieurs fois ( json_tokener_parse_ex()
, et libéré ( json_tokener_free()
) pendant que les objets json_object vivent.
Une arborescence json_object peut être sérialisée en une chaîne avec json_object_to_json_string_ext()
. La chaîne renvoyée n'est valide que jusqu'au prochain appel "to_json_string" sur ce même objet. De plus, il est libéré lorsque le json_object est libéré.