メインページ
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 のバージョン、実行している OS、およびその他の関連する詳細を必ず含めてください。完全に再現可能なテスト ケースや問題を修正するパッチは非常に歓迎されます。
バグの修正や小さな新機能は、プル リクエストとして直接送信できます。主要な新機能や何らかの大きな変更については、まずフォーラムでディスカッションを開始してください。
git
、 gcc
、 cmake
を使用して Unix 上に構築するすでに json-c がインストールされている場合は、プログラムをビルドしてそれに対してリンクする方法については、 libjson-c
へのリンク」を参照してください。
ビルドステータス
テストステータス
gcc
、 clang
、または別の C コンパイラ
cmake>=2.8
、 >=3.16
推奨、テスト用はcmake=>3.1
ドキュメントを生成するには、以下も必要です。
doxygen>=1.8.13
比較的新しいシステムを使用している場合は、OS のパッケージ化システムを使用して前提条件をインストールできる可能性があります。
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) の使用を無効にします。 |
無効_エラー | ブール | -Werror の使用を無効にします。 |
DISABLE_EXTRA_LIBS | ブール | 追加のライブラリ libbsd の使用を無効にする |
DISABLE_JSON_POINTER | ブール | ビルドから json_pointer サポートを省略します。 |
ENABLE_RDRAND | ブール | RDRAND ハードウェア RNG ハッシュ シードを有効にします。 |
ENABLE_THREADING | ブール | 部分的なスレッドのサポートを有効にします。 |
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 は、比較交換操作を使用して、ランダム シードが 1 回だけ生成されるようにします。これは 1 回限りの操作であるため、比較交換操作が使用可能な場合には常にコンパイルされます。
古い autoconf/autogen.sh/configure メソッドに慣れている人のために、cmake への移行を容易にするcmake-configure
ラッパー スクリプトがあります。
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_tokener (つまりjson_tokener_parse_ex()
) でテキストを解析するか、 ( json_object_new_object()
、 json_object_new_int()
などを使用して) 作成して追加 ( json_object_object_add()
、 json_object_array_add()
など...)個別に。通常、ツリー内のすべてのオブジェクトは、その親からの参照を 1 つ持ちます。オブジェクトのツリーの処理が完了したら、ルート オブジェクトのみに対して 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_object オブジェクトが存続している間、割り当て ( json_tokener_new()
) または 1 回または複数回の使用 ( json_tokener_parse_ex()
、および解放 ( json_tokener_free()
) が可能です。
json_object ツリーは、 json_object_to_json_string_ext()
を使用してシリアル化して文字列に戻すことができます。返される文字列は、同じオブジェクトに対する次の "to_json_string" 呼び出しまでのみ有効です。また、json_object が解放されると、それも解放されます。