الصفحة الرئيسية
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
json-c
جيثب الريبو: 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). |
DISABLE_WERROR | بول | تعطيل استخدام -Werror. |
DISABLE_EXTRA_LIBS | بول | تعطيل استخدام المكتبات الإضافية، libbsd |
DISABLE_JSON_POINTER | بول | حذف دعم json_pointer من الإصدار. |
ENABLE_RDRAND | بول | تمكين RDRAND Hardware RNG Hash Seed. |
تمكين_الخيط | بول | تمكين دعم الترابط الجزئي. |
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، يوجد برنامج نصي مجمّع cmake-configure
لتسهيل الانتقال إلى cmake.
mkdir build
cd build
../cmake-configure --prefix=/some/install/path
make
يمكن أن يستغرق تكوين cmake بعض الخيارات.
خيارات | وصف |
---|---|
بادئة = PREFIX | تثبيت الملفات المستقلة عن البنية في PREFIX |
تمكين خيوط | تمكين التعليمات البرمجية لدعم الاستخدام متعدد الخيوط جزئيًا |
تمكين rdrand | تمكين إنشاء RDRAND Hardware RNG Hash Seed على الأنظمة الأساسية المدعومة x86/x64. |
تمكين المشتركة | إنشاء مكتبات مشتركة [افتراضي=نعم] |
تمكين ثابت | إنشاء مكتبات ثابتة [افتراضي=نعم] |
تعطيل Bsymbolic | تجنب الارتباط بوظيفة -Bsymbolic |
خطأ تعطيل | تجنب التعامل مع تحذيرات المترجم كأخطاء فادحة |
افتراضيًا، إذا كان 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
يمكنك تنزيل 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.