halaman utama
vcpkg
JSON-C mengimplementasikan model objek penghitungan referensi yang memungkinkan Anda dengan mudah membuat objek JSON di C, mengeluarkannya sebagai string berformat JSON, dan mengurai string berformat JSON kembali ke representasi C objek JSON. Ini bertujuan untuk menyesuaikan diri dengan RFC 8259.
Lewati ke Menggunakan json-c atau lihat dokumen API, jika Anda sudah menginstal json-c dan siap digunakan.
Halaman beranda untuk json-c: https://github.com/json-c/json-c/wiki
Jika Anda memiliki pertanyaan tentang penggunaan json-c, silakan mulai topik di forum kami di: https://groups.google.com/forum/#!forum/json-c
Jika Anda yakin telah menemukan bug, laporkan di (https://github.com/json-c/json-c/issues). Pastikan untuk menyertakan versi json-c yang Anda gunakan, OS yang Anda jalankan, dan detail relevan lainnya. Test case dan/atau patch yang dapat direproduksi sepenuhnya untuk memperbaiki masalah sangat kami hargai.
Perbaikan bug, atau fitur kecil baru dapat langsung dikirimkan sebagai permintaan tarik. Untuk fitur-fitur baru yang besar atau perubahan besar dalam bentuk apa pun, silakan memulai diskusi terlebih dahulu di forum.
git
, gcc
dan cmake
Jika Anda sudah menginstal json-c, lihat Menautkan ke libjson-c
untuk mengetahui cara membuat dan menautkan program Anda ke json-c.
Membangun Status
Status Tes
gcc
, clang
, atau kompiler C lainnya
cmake>=2.8
, >=3.16
direkomendasikan, cmake=>3.1
untuk pengujian
Untuk membuat dokumen, Anda juga memerlukan:
doxygen>=1.8.13
Jika Anda menggunakan sistem yang relatif modern, kemungkinan besar Anda dapat menginstal prasyarat menggunakan sistem pengemasan OS Anda.
sudo apt install git
sudo apt install cmake
sudo apt install doxygen # optional
sudo apt install valgrind # optional
json-c
repo 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
Catatan: Anda juga dapat meletakkan direktori build Anda di dalam direktori sumber json-c, atau bahkan tidak menggunakan direktori build terpisah sama sekali, namun hal-hal tertentu mungkin tidak berfungsi dengan baik (khususnya, make distcheck
)
Kemudian:
$ make
$ make test
$ make USE_VALGRIND=0 test # optionally skip using valgrind
$ sudo make install # it could be necessary to execute make install
Dokumentasi perpustakaan dapat dihasilkan langsung dari kode sumber menggunakan alat Doxygen:
# in build directory
make doc
google-chrome doc/html/index.html
Pustaka json-c dibuat dengan CMake, yang dapat mengambil beberapa opsi.
Variabel | Jenis | Keterangan |
---|---|---|
CMAKE_INSTALL_PREFIX | Rangkaian | Lokasi pemasangan. |
CMAKE_BUILD_TYPE | Rangkaian | Defaultnya adalah "debug". |
BUILD_SHARE_LIBS | Bodoh | Build default menghasilkan perpustakaan dinamis (dll/so). Setel ini ke OFF untuk membuat perpustakaan statis saja. |
BUILD_STATIC_LIBS | Bodoh | Build default menghasilkan perpustakaan statis (lib/a). Setel ini ke MATI untuk membuat perpustakaan bersama saja. |
DISABLE_STATIC_FPIC | Bodoh | Kode independen posisi build default. Setel ini ke MATI untuk membuat perpustakaan bersama saja. |
DISABLE_BSYMBOLIC | Bodoh | Nonaktifkan penggunaan fungsi -Bsymbolic. |
DISABLE_THREAD_LOCAL_STORAGE | Bodoh | Nonaktifkan penggunaan Thread-Local Storage (HAVE___THREAD). |
DISABLE_WERROR | Bodoh | Nonaktifkan penggunaan -Werror. |
DISABLE_EXTRA_LIBS | Bodoh | Nonaktifkan penggunaan perpustakaan tambahan, libbsd |
DISABLE_JSON_POINTER | Bodoh | Hilangkan dukungan json_pointer dari build. |
ENABLE_RDRAND | Bodoh | Aktifkan Benih Hash RNG Perangkat Keras RDRAND. |
ENABLE_THREADING | Bodoh | Aktifkan dukungan threading parsial. |
OVERRIDE_GET_RANDOM_SEED | Rangkaian | Sebuah blok kode untuk digunakan sebagai pengganti implementasi default json_c_get_random_seed(), misalnya pada platform tertanam yang bahkan fallback ke time() tidak berfungsi. Harus berupa satu baris. |
Berikan opsi ini sebagai -D
pada baris perintah CMake.
# build a static library only
cmake -DBUILD_SHARED_LIBS=OFF ..
Meskipun json-c tidak sepenuhnya mendukung akses multi-utas ke pohon objek, json-c memiliki beberapa kode untuk membantu membuat penggunaannya dalam program berulir sedikit lebih aman. Saat ini, ini terbatas pada penggunaan operasi atom untuk json_object_get() dan json_object_put().
Karena ini mungkin berdampak pada kinerja, setidaknya 3x lebih lambat menurut https://stackoverflow.com/a/11609063, ini dinonaktifkan secara default. Anda dapat mengaktifkannya dengan menyesuaikan perintah cmake Anda dengan: -DENABLE_THREADING=ON
Secara terpisah, fungsi hash default yang digunakan untuk kunci bidang objek, lh_char_hash, menggunakan operasi bandingkan dan tukar untuk memastikan benih acak hanya dihasilkan satu kali. Karena ini adalah operasi satu kali, maka selalu dikompilasi ketika operasi perbandingan dan pertukaran tersedia.
Bagi mereka yang akrab dengan metode autoconf/autogen.sh/configure yang lama, terdapat skrip pembungkus cmake-configure
untuk memudahkan transisi ke cmake.
mkdir build
cd build
../cmake-configure --prefix=/some/install/path
make
cmake-configure dapat mengambil beberapa opsi.
pilihan | Keterangan |
---|---|
awalan=Awalan | instal file yang tidak bergantung pada arsitektur di PREFIX |
aktifkan-threading | Aktifkan kode untuk mendukung penggunaan sebagian multi-utas |
aktifkan-rdrand | Aktifkan pembuatan RNG Hash Seed Perangkat Keras RDRAND pada platform x86/x64 yang didukung. |
aktifkan-dibagikan | membangun perpustakaan bersama [default=yes] |
aktifkan-statis | membangun perpustakaan statis [default=yes] |
nonaktifkan-Bsimbolik | Hindari menghubungkan dengan fungsi -Bsymbolic |
nonaktifkan-kesalahan | Hindari memperlakukan peringatan kompiler sebagai kesalahan fatal |
Secara default, jika valgrind tersedia, pengujian yang sedang berjalan akan menggunakannya. Hal ini dapat memperlambat pengujian secara signifikan, jadi untuk menonaktifkannya gunakan:
export USE_VALGRIND=0
Untuk menjalankan pengujian, disarankan menggunakan direktori build terpisah:
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
Jika pengujian gagal, periksa Testing/Temporary/LastTest.log
, tests/testSubDir/${testname}/${testname}.vg.out
, dan file serupa lainnya. Jika outputnya tidak mencukupi, coba:
VERBOSE=1 CTEST_OUTPUT_ON_FAILURE=1 make test
atau
JSONC_TEST_TRACE=1 make test
dan periksa kembali file log.
vcpkg
Anda dapat mengunduh dan menginstal JSON-C menggunakan pengelola ketergantungan vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install json-c
Port JSON-C di vcpkg selalu diperbarui oleh anggota tim Microsoft dan kontributor komunitas. Jika versinya sudah kedaluwarsa, silakan buat masalah atau tarik permintaan pada repositori vcpkg.
Pembuatan di Android kini didukung dengan baik, namun ada beberapa laporan keberhasilan menggunakan 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
Jika sistem Anda memiliki pkgconfig
, Anda cukup menambahkan ini ke makefile
Anda:
CFLAGS += $( shell pkg-config --cflags json-c)
LDFLAGS += $( shell pkg-config --libs json-c)
Tanpa pkgconfig
, Anda mungkin melakukan sesuatu seperti ini:
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
Jika proyek Anda menggunakan 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 ..
Untuk menggunakan json-c Anda dapat menyertakan json.h, atau sebaiknya, salah satu file header yang lebih spesifik berikut ini:
json_object_object_foreach()
di json_object.h)Untuk daftar lengkap header lihat files.html
Tipe utama di json-c adalah json_object. Ini menggambarkan pohon referensi terhitung objek json yang dibuat dengan mengurai teks dengan json_tokener (yaitu json_tokener_parse_ex()
), atau dengan membuat (dengan json_object_new_object()
, json_object_new_int()
, dll...) dan menambahkan (dengan json_object_object_add()
, json_object_array_add()
, dll...) satu per satu. Biasanya, setiap objek di pohon akan memiliki satu referensi, dari induknya. Ketika Anda selesai dengan pohon objek, Anda memanggil json_object_put() hanya pada objek root untuk membebaskannya, yang berulang melalui objek anak apa pun yang memanggil json_object_put() pada masing-masing objek tersebut secara bergantian.
Anda bisa mendapatkan referensi ke satu anak ( json_object_object_get()
atau json_object_array_get_idx()
) dan menggunakan objek tersebut selama induknya valid.
Jika Anda membutuhkan objek anak untuk hidup lebih lama dari induknya, Anda dapat menambah jumlah refcount anak ( json_object_get()
) agar objek tersebut dapat bertahan jika induknya dibebaskan atau dihapus dari induknya ( json_object_object_del()
atau json_object_array_del_idx()
)
Saat mengurai teks, objek json_tokener tidak bergantung pada json_object yang dikembalikannya. Itu dapat dialokasikan ( json_tokener_new()
) digunakan satu atau beberapa kali ( json_tokener_parse_ex()
, dan dibebaskan ( json_tokener_free()
) selagi objek json_object tetap hidup.
Pohon json_object dapat diserialkan kembali menjadi string dengan json_object_to_json_string_ext()
. String yang dikembalikan hanya valid hingga panggilan "to_json_string" berikutnya pada objek yang sama. Juga, itu dibebaskan ketika json_object dibebaskan.