หน้าหลัก
vcpkg
JSON-C ใช้โมเดลการนับออบเจ็กต์อ้างอิงที่ช่วยให้คุณสามารถสร้างออบเจ็กต์ JSON ในภาษา C ได้อย่างง่ายดาย ส่งออกเป็นสตริงที่จัดรูปแบบ JSON และแยกวิเคราะห์สตริงที่จัดรูปแบบ JSON กลับเข้าไปในการแสดง C ของออบเจ็กต์ JSON มีจุดมุ่งหมายเพื่อให้สอดคล้องกับ RFC 8259
ข้ามไปที่การใช้ json-c หรือตรวจสอบเอกสาร API หากคุณติดตั้ง json-c และพร้อมใช้งานแล้ว
หน้าแรกสำหรับ 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 ที่คุณใช้ ระบบปฏิบัติการที่คุณกำลังใช้งาน และรายละเอียดอื่นๆ ที่เกี่ยวข้อง กรณีทดสอบที่สามารถทำซ้ำได้อย่างสมบูรณ์และ/หรือโปรแกรมแก้ไขเพื่อแก้ไขปัญหาได้รับการชื่นชมอย่างมาก
การแก้ไขจุดบกพร่องหรือฟีเจอร์ใหม่เล็กๆ น้อยๆ สามารถส่งเป็นคำขอดึงได้โดยตรง สำหรับคุณสมบัติใหม่ที่สำคัญหรือการเปลี่ยนแปลงครั้งใหญ่ใดๆ โปรดเริ่มการสนทนาในฟอรัมก่อน
git
, gcc
และ cmake
หากคุณติดตั้ง json-c ไว้แล้ว โปรดดูการลิงก์ไปยัง libjson-c
สำหรับวิธีสร้างและลิงก์โปรแกรมของคุณกับมัน
สถานะการสร้าง
สถานะการทดสอบ
gcc
, clang
หรือคอมไพเลอร์ C อื่น ๆ
cmake>=2.8
, >=3.16
แนะนำ, cmake=>3.1
สำหรับการทดสอบ
ในการสร้างเอกสาร คุณจะต้องมี:
doxygen>=1.8.13
หากคุณใช้ระบบที่ค่อนข้างทันสมัย คุณจะสามารถติดตั้งข้อกำหนดเบื้องต้นได้โดยใช้ระบบแพ็คเกจของระบบปฏิบัติการของคุณ
sudo apt install git
sudo apt install cmake
sudo apt install doxygen # optional
sudo apt install valgrind # optional
ที่เก็บ repo ของ 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
หมายเหตุ: เป็นไปได้ที่จะวางไดเร็กทอรี build ของคุณไว้ในไดเร็กทอรีซอร์ส json-c หรือแม้กระทั่งไม่ใช้ไดเร็กทอรี build แยกต่างหากเลย แต่บางสิ่งอาจทำงานไม่ถูกต้องนัก (โดยเฉพาะอย่างยิ่ง 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 | สตริง | ค่าเริ่มต้นคือ "debug" |
BUILD_SHARED_LIBS | บูล | โครงสร้างเริ่มต้นจะสร้างไลบรารีไดนามิก (dll/so) ตั้งค่านี้เป็นปิดเพื่อสร้างไลบรารีแบบคงที่เท่านั้น |
BUILD_STATIC_LIBS | บูล | โครงสร้างเริ่มต้นจะสร้างไลบรารีแบบคงที่ (lib/a) ตั้งค่านี้เป็นปิดเพื่อสร้างไลบรารีที่ใช้ร่วมกันเท่านั้น |
DISABLE_STATIC_FPIC | บูล | ค่าเริ่มต้นจะสร้างโค้ดอิสระสำหรับตำแหน่ง ตั้งค่านี้เป็นปิดเพื่อสร้างไลบรารีที่ใช้ร่วมกันเท่านั้น |
DISABLE_BSYMBOLIC | บูล | ปิดการใช้งาน -B Symbolic-functions |
DISABLE_THREAD_LOCAL_STORAGE | บูล | ปิดการใช้งาน Thread-Local Storage (HAVE___THREAD) |
DISABLE_WERROR | บูล | ปิดการใช้งาน -Werror |
DISABLE_EXTRA_LIBS | บูล | ปิดการใช้งานไลบรารีเพิ่มเติม libbsd |
DISABLE_JSON_POINTER | บูล | ละเว้นการสนับสนุน json_pointer จากบิลด์ |
ENABLE_RDRAND | บูล | เปิดใช้งานฮาร์ดแวร์ RDRAND RNG Hash Seed |
ENABLE_THREADING | บูล | เปิดใช้งานการสนับสนุนเธรดบางส่วน |
OVERRIDE_GET_RANDOM_SEED | สตริง | บล็อกของโค้ดที่จะใช้แทนการใช้งานเริ่มต้นของ json_c_get_random_seed() เช่น บนแพลตฟอร์มแบบฝังซึ่งแม้แต่ทางเลือกของ time() ก็ใช้ไม่ได้ ต้องเป็นเส้นเดียว |
ส่งตัวเลือกเหล่านี้เป็น -D
บนบรรทัดคำสั่งของ CMake
# build a static library only
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 ใช้การดำเนินการเปรียบเทียบและสลับเพื่อให้แน่ใจว่าเมล็ดสุ่มจะถูกสร้างขึ้นเพียงครั้งเดียวเท่านั้น เนื่องจากนี่เป็นการดำเนินการครั้งเดียว จึงถูกคอมไพล์เสมอเมื่อมีการดำเนินการเปรียบเทียบและสลับ
สำหรับผู้ที่คุ้นเคยกับเมธอด autoconf/autogen.sh/configure แบบเก่า จะมีสคริปต์ wrapper cmake-configure
เพื่อให้การเปลี่ยนไปใช้ cmake ง่ายขึ้น
mkdir build
cd build
../cmake-configure --prefix=/some/install/path
make
cmake-configure อาจมีหลายตัวเลือก
ตัวเลือก | คำอธิบาย |
---|---|
คำนำหน้า=คำนำหน้า | ติดตั้งไฟล์ที่ไม่ขึ้นอยู่กับสถาปัตยกรรมใน PREFIX |
เปิดใช้งานเธรด | เปิดใช้งานโค้ดเพื่อรองรับการใช้งานแบบมัลติเธรดบางส่วน |
เปิดใช้งาน rdrand | เปิดใช้งานการสร้าง Seed Hash Seed ของฮาร์ดแวร์ RDRAND บนแพลตฟอร์ม x86/x64 ที่รองรับ |
เปิดใช้งานการแบ่งปัน | สร้างไลบรารีที่ใช้ร่วมกัน [ค่าเริ่มต้น = ใช่] |
เปิดใช้งานแบบคงที่ | สร้างไลบรารีแบบคงที่ [ค่าเริ่มต้น = ใช่] |
ปิดการใช้งาน-Bสัญลักษณ์ | หลีกเลี่ยงการเชื่อมโยงกับ -B Symbolic-function |
ปิดการใช้งาน-werror | หลีกเลี่ยงการปฏิบัติต่อคำเตือนของคอมไพเลอร์ว่าเป็นข้อผิดพลาดร้ายแรง |
ตามค่าเริ่มต้น หาก valgrind พร้อมใช้งาน การทดสอบที่ใช้อยู่ ซึ่งจะทำให้การทดสอบช้าลงอย่างมาก ดังนั้นหากต้องการปิดใช้งานให้ใช้:
export USE_VALGRIND=0
หากต้องการรันการทดสอบ แนะนำให้ใช้ไดเร็กทอรี build แยกต่างหาก:
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
คุณสามารถดาวน์โหลดและติดตั้ง JSON-C ได้โดยใช้ตัวจัดการการพึ่งพา vcpkg:
git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
vcpkg install json-c
พอร์ต JSON-C ใน vcpkg ได้รับการอัปเดตโดยสมาชิกทีม 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()
ใน json_object.h)สำหรับรายการส่วนหัวทั้งหมด โปรดดูที่ files.html
ประเภทหลักใน json-c คือ json_object มันอธิบายต้นไม้ที่นับการอ้างอิงของวัตถุ json ซึ่งสร้างขึ้นโดยการแยกวิเคราะห์ข้อความด้วย json_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()
) และใช้วัตถุนั้นตราบใดที่พาเรนต์นั้นถูกต้อง
หากคุณต้องการให้อ็อบเจ็กต์ลูกมีอายุยืนยาวกว่าพาเรนต์ คุณสามารถเพิ่มการนับซ้ำของเด็ก ( json_object_get()
) เพื่อให้วัตถุสามารถอยู่รอดได้พาเรนต์ถูกปลดปล่อยหรือถูกลบออกจากพาเรนต์ ( json_object_object_del()
หรือ json_object_array_del_idx()
)
เมื่อแยกวิเคราะห์ข้อความ อ็อบเจ็กต์ json_tokener จะไม่ขึ้นอยู่กับ json_object ที่ส่งคืน สามารถจัดสรร ( json_tokener_new()
) ใช้หนึ่งครั้งหรือหลายครั้ง ( json_tokener_parse_ex()
และปลดปล่อย ( json_tokener_free()
) ในขณะที่วัตถุ json_object ยังคงอยู่
ต้นไม้ json_object สามารถทำให้เป็นอนุกรมกลับเข้าไปในสตริงด้วย json_object_to_json_string_ext()
สตริงที่ส่งคืนนั้นใช้ได้จนกว่าจะมีการเรียก "to_json_string" ครั้งถัดไปบนวัตถุเดียวกันนั้น นอกจากนี้ยังเป็นอิสระเมื่อ json_object ถูกปลดปล่อย