mainpage
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) 사용을 비활성화합니다. |
DISABLE_WERROR | 부울 | -Werror 사용을 비활성화합니다. |
DISABLE_EXTRA_LIBS | 부울 | 추가 라이브러리 libbsd 사용 비활성화 |
DISABLE_JSON_POINTER | 부울 | 빌드에서 json_pointer 지원을 생략합니다. |
ENABLE_RDAND | 부울 | 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배 이상 느린 영향을 미칠 수 있으므로 기본적으로 비활성화되어 있습니다. -DENABLE_THREADING=ON을 사용하여 cmake 명령을 조정하여 켤 수 있습니다.
이와 별도로 객체 필드 키에 사용되는 기본 해시 함수인 lh_char_hash는 비교 및 교환 작업을 사용하여 무작위 시드가 한 번만 생성되도록 합니다. 이는 일회성 작업이므로 비교 및 교환 작업이 가능할 때 항상 컴파일됩니다.
이전 autoconf/autogen.sh/configure 방법에 익숙한 사람들을 위해 cmake로의 전환을 쉽게 해주는 cmake-configure
래퍼 스크립트가 있습니다.
mkdir build
cd build
../cmake-configure --prefix=/some/install/path
make
cmake-configure에는 몇 가지 옵션이 있습니다.
옵션 | 설명 |
---|---|
접두사=PREFIX | PREFIX에 아키텍처 독립적인 파일 설치 |
스레딩 활성화 | 부분적으로 멀티스레드 사용을 지원하도록 코드 활성화 |
활성화-rdrand | 지원되는 x86/x64 플랫폼에서 RDRAND 하드웨어 RNG 해시 시드 생성을 활성화합니다. |
공유 활성화 | 공유 라이브러리 구축 [기본값=yes] |
활성화-정적 | 정적 라이브러리 구축 [기본값=예] |
비활성화-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 객체의 참조 계산 트리를 설명합니다. 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_object 객체가 존재하는 동안 한 번 또는 여러 번( json_tokener_parse_ex()
) 할당( json_tokener_new()
)하고 해제( json_tokener_free()
)할 수 있습니다.
json_object 트리는 json_object_to_json_string_ext()
를 사용하여 문자열로 다시 직렬화할 수 있습니다. 반환된 문자열은 동일한 개체에 대한 다음 "to_json_string" 호출까지만 유효합니다. 또한 json_object가 해제되면 해제됩니다.