jsoncons는 JSON 및 CBOR과 같은 JSON 유사 데이터 형식을 구성하기 위한 C++ 헤더 전용 라이브러리입니다. 지원되는 각 데이터 형식에 대해 다음과 같은 다양한 방법으로 데이터 작업을 수행할 수 있습니다.
변형과 유사하고 할당자를 인식하는 데이터 구조인 basic_json
json_type_traits를 구현하는 강력한 형식의 C++ 데이터 구조
구문 분석 이벤트 스트림에 대한 커서 수준 액세스를 통해 XML 세계의 StAX 풀 구문 분석 및 푸시 직렬화와 다소 유사합니다.
다른 JSON 라이브러리와 비교하여 jsoncons는 매우 큰 JSON 텍스트를 처리하도록 설계되었습니다. 그 중심에는 SAX 스타일 파서와 직렬 변환기가 있습니다. 변형과 유사한 구조로 메모리에서 전체 JSON 텍스트를 읽는 것을 지원합니다. 그러나 StAX 스타일 풀 구문 분석 및 푸시 직렬화를 사용하여 기본 데이터에 대한 효율적인 액세스도 지원합니다. 또한 json_type_traits의 전문화를 통해 제공되는 사용자 유형에 대한 정보를 사용하여 사용자가 선호하는 형식으로 증분 구문 분석을 지원합니다.
jsoncons 데이터 모델은 null, 부울, 숫자, 문자열, 배열, 객체 등 친숙한 JSON 유형과 바이트 문자열을 지원합니다. 또한 jsoncons는 날짜/시간, 신기원 시간, 큰 정수, 큰 소수, 큰 부동 소수점 및 이진 인코딩의 의미 체계 태그 지정을 지원합니다. 이를 통해 CBOR과 같은 JSON과 유사한 데이터 형식을 구문 분석할 때 이러한 유형 의미 체계를 보존할 수 있습니다.
jsoncons는 Boost 소프트웨어 라이선스에 따라 배포됩니다.
jsoncons는 무료이지만 지속적인 개발을 위한 지원을 환영합니다. 이 라이브러리가 도움이 되었다면 일회성 기부를 하거나 ❤️ 후원자가 되어 보세요.
jsoncons
라이브러리가 발전함에 따라 이름이 변경되는 경우도 있습니다. 전환을 쉽게 하기 위해 jsoncons는 이전 이름을 더 이상 사용하지 않지만 많은 이름을 계속 지원합니다. 더 이상 사용되지 않는 이름은 JSONCONS_NO_DEPRECATED
매크로를 정의하여 억제할 수 있으며, 새 코드에는 그렇게 하는 것이 좋습니다.
"Apache Kvrocks는 지속적으로 jsoncons를 활용하여 사용자에게 JSON 데이터 구조에 대한 지원을 제공합니다. 우리는 jsoncons를 사용한 개발 경험이 훌륭하다고 생각합니다!"
"나는 내 모국어인 R로 귀하의 라이브러리를 사용해 왔으며 (a) JSON 문자열 또는 R 개체에 대한 JMESpath 및 JSONpath 쿼리와 (b) 다른 R 개발자가 귀하의 라이브러리에 쉽게 연결할 수 있도록 R 패키지를 만들었습니다. ."
"저는 데이터를 전달하기 위한 외부 인터페이스와 csv에서 json으로의 변환을 사용하는 데 귀하의 라이브러리를 사용하고 있습니다. 이는 javascript에서 사용할 데이터를 변환하는 데 정말 도움이 됩니다."
"JSON 및 CBOR의 요구 사항에 맞게 완벽하게 작동하는지 확인했습니다."
"이 라이브러리의 JSONPath 기능은 훌륭합니다."
"우리는 JMESPath 구현을 상당히 광범위하게 사용합니다."
"우리는 JSON 스키마 유효성 검사기를 좋아합니다. 우리는 데이터 모델링 도구인 ER/Studio에서 이를 사용하여 JSON 스키마 파일을 구문 분석하여 해당 파일로부터 엔터티 관계 모델을 생성할 수 있습니다."
"아름다운 매핑과 사용 편의성을 갖춘 직렬화 라이브러리 선택"
"정말 좋다" "멋진 프로젝트" "매우 견고하고 매우 신뢰할 수 있다" "우리 팀이 좋아한다" "귀하의 저장소가 훌륭해요!!!!!"
AWS SDK를 사용하여 HealthImaging 이미지 세트 및 이미지 프레임 시작하기
RubyGems.org rjsoncons Coppelia Robotics CSPro 라이선스
vcpkg 플랫폼 라이브러리 관리자를 사용하여 jsoncons 패키지를 설치할 수 있습니다.
또는 최신 릴리스를 다운로드하고 zip 파일의 압축을 푸세요. include/jsoncons
디렉터리를 include
디렉터리에 복사합니다. 확장 기능을 사용하려면 include/jsoncons_ext
도 복사하세요.
또는 메인에서 최신 코드를 다운로드하세요.
라이브러리에는 C++11을 지원하는 C++ 컴파일러가 필요합니다. 또한 라이브러리는 jsoncons::endian
, jsoncons::basic_string_view
, jsoncons::optional
및 jsoncons::span
정의하며, 감지되면 표준 라이브러리에 해당하는 항목으로 형식 정의됩니다. 그렇지 않으면 내부 C++11 호환 구현으로 형식 정의됩니다.
라이브러리는 예외를 사용하고 어떤 경우에는 std::error_code를 사용하여 오류를 보고합니다. jsoncons::assertion_error
외에도 모든 jsoncons 예외 클래스는 jsoncons::json_error 인터페이스를 구현합니다. 예외가 비활성화되거나 컴파일 시간 매크로 JSONCONS_NO_EXCEPTIONS
가 정의된 경우 throw는 std::terminate
에 대한 호출이 됩니다.
json_benchmarks는 jsoncons
다른 json
라이브러리와 어떻게 비교되는지에 대한 몇 가지 측정값을 제공합니다.
JSONTestSuite 및 JSON_checker 테스트 스위트
텍스트와 정수를 사용한 성능 벤치마크
텍스트와 복식을 사용한 성능 벤치마크
JSONPath 비교는 jsoncons JsonPath가 다른 구현과 어떻게 비교되는지 보여줍니다.
JSON 데이터 작업
CBOR 데이터 작업
아래 예에서는 일부 헤더 파일을 포함하고 JSON 데이터 문자열을 초기화해야 합니다.
# include < jsoncons/json.hpp >
# include < jsoncons_ext/jsonpath/jsonpath.hpp >
# include < iostream >
using namespace jsoncons ; // for convenience
std::string data = R"(
{
"application": "hiking",
"reputons": [
{
"rater": "HikingAsylum",
"assertion": "advanced",
"rated": "Marilyn C",
"rating": 0.90,
"generated": 1514862245
}
]
}
)" ;
jsoncons를 사용하면 다음과 같은 다양한 방법으로 데이터 작업을 수행할 수 있습니다.
변형형 데이터 구조로 basic_json
json_type_traits를 구현하는 강력한 형식의 C++ 데이터 구조
구문 분석 이벤트 스트림에 대한 커서 수준 액세스 사용
int main ()
{
// Parse the string of data into a json value
json j = json::parse (data);
// Does object member reputons exist?
std::cout << " (1) " << std::boolalpha << j. contains ( " reputons " ) << " nn " ;
// Get a reference to reputons array
const json& v = j[ " reputons " ];
// Iterate over reputons array
std::cout << " (2) n " ;
for ( const auto & item : v. array_range ())
{
// Access rated as string and rating as double
std::cout << item[ " rated " ]. as <std::string>() << " , " << item[ " rating " ]. as < double >() << " n " ;
}
std::cout << " n " ;
// Select all "rated" with JSONPath
std::cout << " (3) n " ;
json result = jsonpath::json_query (j, " $..rated " );
std::cout << pretty_print (result) << " nn " ;
// Serialize back to JSON
std::cout << " (4) n " << pretty_print (j) << " nn " ;
}
산출:
(1) true
(2)
Marilyn C, 0.9
(3)
[
"Marilyn C"
]
(4)
{
"application": "hiking",
"reputons": [
{
"assertion": "advanced",
"generated": 1514862245,
"rated": "Marilyn C",
"rater": "HikingAsylum",
"rating": 0.9
}
]
}
jsoncons는 JSON 텍스트를 C++ 데이터 구조로 변환하는 것을 지원합니다. decode_json 및 encode_json 함수는 JSON 데이터의 문자열 또는 스트림을 C++ 데이터 구조로 변환하거나 그 반대로 변환합니다. json_type_traits가 정의된 모든 C++ 클래스에 대한 디코딩 및 인코딩 작업이 수행됩니다. jsoncons는 이미 표준 라이브러리에서 많은 유형을 지원하며, jsoncons
네임스페이스에서 json_type_traits
전문화하면 사용자 고유의 유형도 지원됩니다.
namespace ns {
enum class hiking_experience {beginner,intermediate,advanced};
class hiking_reputon
{
std::string rater_;
hiking_experience assertion_;
std::string rated_;
double rating_;
std::optional<std::chrono::seconds> generated_; // assumes C++17, if not use jsoncons::optional
std::optional<std::chrono::seconds> expires_;
public:
hiking_reputon ( const std::string& rater,
hiking_experience assertion,
const std::string& rated,
double rating,
const std::optional<std::chrono::seconds>& generated =
std::optional<std::chrono::seconds>(),
const std::optional<std::chrono::seconds>& expires =
std::optional<std::chrono::seconds>())
: rater_(rater), assertion_(assertion), rated_(rated), rating_(rating),
generated_ (generated), expires_(expires)
{
}
const std::string& rater () const { return rater_;}
hiking_experience assertion () const { return assertion_;}
const std::string& rated () const { return rated_;}
double rating () const { return rating_;}
std::optional<std::chrono::seconds> generated () const { return generated_;}
std::optional<std::chrono::seconds> expires () const { return expires_;}
friend bool operator ==( const hiking_reputon& lhs, const hiking_reputon& rhs)
{
return lhs. rater_ == rhs. rater_ && lhs. assertion_ == rhs. assertion_ &&
lhs. rated_ == rhs. rated_ && lhs. rating_ == rhs. rating_ &&
lhs. confidence_ == rhs. confidence_ && lhs. expires_ == rhs. expires_ ;
}
friend bool operator !=( const hiking_reputon& lhs, const hiking_reputon& rhs)
{
return !(lhs == rhs);
};
};
class hiking_reputation
{
std::string application_;
std::vector<hiking_reputon> reputons_;
public:
hiking_reputation ( const std::string& application,
const std::vector<hiking_reputon>& reputons)
: application_(application),
reputons_ (reputons)
{}
const std::string& application () const { return application_;}
const std::vector<hiking_reputon>& reputons () const { return reputons_;}
};
} // namespace ns
// Declare the traits. Specify which data members need to be serialized.
JSONCONS_ENUM_TRAITS (ns::hiking_experience, beginner, intermediate, advanced)
// First four members listed are mandatory, generated and expires are optional
JSONCONS_N_CTOR_GETTER_TRAITS(ns::hiking_reputon, 4 , rater, assertion, rated, rating,
generated, expires)
// All members are mandatory
JSONCONS_ALL_CTOR_GETTER_TRAITS(ns::hiking_reputation, application, reputons)
int main()
{
// Decode the string of data into a c++ structure
ns::hiking_reputation v = decode_json<ns::hiking_reputation>(data);
// Iterate over reputons array value
std::cout << " (1) n " ;
for ( const auto & item : v. reputons ())
{
std::cout << item. rated () << " , " << item. rating ();
if (item. generated ())
{
std::cout << " , " << (*item. generated ()). count ();
}
std::cout << " n " ;
}
// Encode the c++ structure into a string
std::string s;
encode_json (v, s, indenting::indent);
std::cout << " (2) n " ;
std::cout << s << " n " ;
}
산출:
(1)
Marilyn C, 0.9, 1514862245
(2)
{
"application": "hiking",
"reputons": [
{
"assertion": "advanced",
"generated": 1514862245,
"rated": "Marilyn C",
"rater": "HikingAsylum",
"rating": 0.9
}
]
}
이 예에서는 편의 매크로 JSONCONS_ENUM_TRAITS
, JSONCONS_N_CTOR_GETTER_TRAITS
및 JSONCONS_ALL_CTOR_GETTER_TRAITS
를 사용하여 열거형 유형 ns::hiking_experience
, ns::hiking_reputon
클래스(일부 비필수 멤버 포함) 및 클래스에 대한 json_type_traits를 특수화합니다. ns::hiking_reputation
(모든 필수 멤버 포함) JSONCONS_ENUM_TRAITS
매크로는 열거형 식별자에서 코드를 생성하고 JSONCONS_N_CTOR_GETTER_TRAITS
및 JSONCONS_ALL_CTOR_GETTER_TRAITS
매크로는 get 함수 및 생성자에서 코드를 생성합니다. 이러한 매크로 선언은 네임스페이스 블록 외부에 배치되어야 합니다.
json_type_traits
전문화하는 다른 방법에 대한 예제를 참조하세요.
일반적인 풀 구문 분석 애플리케이션은 done()
true
반환할 때까지 current()
이벤트를 반복적으로 처리하고 next()
호출하여 다음 이벤트로 진행합니다.
int main ()
{
json_string_cursor cursor (data);
for (; !cursor. done (); cursor. next ())
{
const auto & event = cursor. current ();
switch (event. event_type ())
{
case staj_event_type::begin_array:
std::cout << event. event_type () << " " << " n " ;
break ;
case staj_event_type::end_array:
std::cout << event. event_type () << " " << " n " ;
break ;
case staj_event_type::begin_object:
std::cout << event. event_type () << " " << " n " ;
break ;
case staj_event_type::end_object:
std::cout << event. event_type () << " " << " n " ;
break ;
case staj_event_type::key:
// Or std::string_view, if supported
std::cout << event. event_type () << " : " << event. get <jsoncons::string_view>() << " n " ;
break ;
case staj_event_type::string_value:
// Or std::string_view, if supported
std::cout << event. event_type () << " : " << event. get <jsoncons::string_view>() << " n " ;
break ;
case staj_event_type::null_value:
std::cout << event. event_type () << " n " ;
break ;
case staj_event_type::bool_value:
std::cout << event. event_type () << " : " << std::boolalpha << event. get < bool >() << " n " ;
break ;
case staj_event_type::int64_value:
std::cout << event. event_type () << " : " << event. get < int64_t >() << " n " ;
break ;
case staj_event_type::uint64_value:
std::cout << event. event_type () << " : " << event. get < uint64_t >() << " n " ;
break ;
case staj_event_type::double_value:
std::cout << event. event_type () << " : " << event. get < double >() << " n " ;
break ;
default :
std::cout << " Unhandled event type: " << event. event_type () << " " << " n " ;
break ;
}
}
}
산출:
begin_object
key: application
string_value: hiking
key: reputons
begin_array
begin_object
key: rater
string_value: HikingAsylum
key: assertion
string_value: advanced
key: rated
string_value: Marilyn C
key: rating
double_value: 0.9
key: generated
uint64_value: 1514862245
end_object
end_array
end_object
파이프 구문(예: cursor | filter1 | filter2 | ...
)을 사용하여 커서에 필터를 적용할 수 있습니다.
int main ()
{
std::string name;
auto filter = [&]( const staj_event& ev, const ser_context&) -> bool
{
if (ev. event_type () == staj_event_type::key)
{
name = ev. get <std::string>();
return false ;
}
if (name == " rated " )
{
name. clear ();
return true ;
}
return false ;
};
json_string_cursor cursor (data);
auto filtered_c = cursor | filter;
for (; !filtered_c. done (); filtered_c. next ())
{
const auto & event = filtered_c. current ();
switch (event. event_type ())
{
case staj_event_type::string_value:
// Or std::string_view, if C++17
std::cout << event. event_type () << " : " << event. get <jsoncons::string_view>() << " n " ;
break ;
default :
std::cout << " Unhandled event type n " ;
break ;
}
}
}
산출:
Marilyn C
아래 예에서는 일부 헤더 파일을 포함하고 CBOR 데이터 버퍼를 초기화해야 합니다.
# include < iomanip >
# include < iostream >
# include < jsoncons/json.hpp >
# include < jsoncons_ext/cbor/cbor.hpp >
# include < jsoncons_ext/jsonpath/jsonpath.hpp >
using namespace jsoncons ; // for convenience
const std::vector< uint8_t > data = {
0x9f , // Start indefinte length array
0x83 , // Array of length 3
0x63 , // String value of length 3
0x66 , 0x6f , 0x6f , // "foo"
0x44 , // Byte string value of length 4
0x50 , 0x75 , 0x73 , 0x73 , // 'P''u''s''s'
0xc5 , // Tag 5 (bigfloat)
0x82 , // Array of length 2
0x20 , // -1
0x03 , // 3
0x83 , // Another array of length 3
0x63 , // String value of length 3
0x62 , 0x61 , 0x72 , // "bar"
0xd6 , // Expected conversion to base64
0x44 , // Byte string value of length 4
0x50 , 0x75 , 0x73 , 0x73 , // 'P''u''s''s'
0xc4 , // Tag 4 (decimal fraction)
0x82 , // Array of length 2
0x38 , // Negative integer of length 1
0x1c , // -29
0xc2 , // Tag 2 (positive bignum)
0x4d , // Byte string value of length 13
0x01 , 0x8e , 0xe9 , 0x0f , 0xf6 , 0xc3 , 0x73 , 0xe0 , 0xee , 0x4e , 0x3f , 0x0a , 0xd2 ,
0xff // "break"
};
jsoncons를 사용하면 JSON 데이터와 유사하게 CBOR 데이터로 작업할 수 있습니다.
Variant 형태의 데이터 구조로 basic_json
json_type_traits를 구현하는 강력한 형식의 C++ 데이터 구조
구문 분석 이벤트 스트림에 대한 커서 수준 액세스 사용
int main ()
{
// Parse the CBOR data into a json value
json j = cbor::decode_cbor<json>(data);
// Pretty print
std::cout << " (1) n " << pretty_print (j) << " nn " ;
// Iterate over rows
std::cout << " (2) n " ;
for ( const auto & row : j. array_range ())
{
std::cout << row[ 1 ]. as <jsoncons::byte_string>() << " ( " << row[ 1 ]. tag () << " ) n " ;
}
std::cout << " n " ;
// Select the third column with JSONPath
std::cout << " (3) n " ;
json result = jsonpath::json_query (j, " $[*][2] " );
std::cout << pretty_print (result) << " nn " ;
// Serialize back to CBOR
std::vector< uint8_t > buffer;
cbor::encode_cbor (j, buffer);
std::cout << " (4) n " << byte_string_view (buffer) << " nn " ;
}
산출:
(1)
[
["foo", "UHVzcw", "0x3p-1"],
["bar", "UHVzcw==", "1.23456789012345678901234567890"]
]
(2)
50,75,73,73 (n/a)
50,75,73,73 (base64)
(3)
[
"0x3p-1",
"1.23456789012345678901234567890"
]
(4)
82,83,63,66,6f,6f,44,50,75,73,73,c5,82,20,03,83,63,62,61,72,d6,44,50,75,73,73,c4,82,38,1c,c2,4d,01,8e,e9,0f,f6,c3,73,e0,ee,4e,3f,0a,d2
int main ()
{
// Parse the string of data into a std::vector<std::tuple<std::string,jsoncons::byte_string,std::string>> value
auto val = cbor::decode_cbor<std::vector<std::tuple<std::string,jsoncons::byte_string,std::string>>>(data);
std::cout << " (1) n " ;
for ( const auto & row : val)
{
std::cout << std::get< 0 >(row) << " , " << std::get< 1 >(row) << " , " << std::get< 2 >(row) << " n " ;
}
std::cout << " n " ;
// Serialize back to CBOR
std::vector< uint8_t > buffer;
cbor::encode_cbor (val, buffer);
std::cout << " (2) n " << byte_string_view (buffer) << " nn " ;
}
산출:
(1)
foo, 50,75,73,73, 0x3p-1
bar, 50,75,73,73, 1.23456789012345678901234567890
(2)
82,9f,63,66,6f,6f,44,50,75,73,73,66,30,78,33,70,2d,31,ff,9f,63,62,61,72,44,50,75,73,73,78,1f,31,2e,32,33,34,35,36,37,38,39,30,31,32,33,34,35,36,37,38,39,30,31,32,33,34,35,36,37,38,39,30,ff
bigfloat 및 소수 부분을 std::string
으로 디코딩할 때 태그와 함께 보존된 데이터 구조와 같은 변형의 의미 정보가 손실되므로 CBOR로 다시 직렬화하면 텍스트 문자열이 생성됩니다.
일반적인 풀 구문 분석 애플리케이션은 done()
true
반환할 때까지 current()
이벤트를 반복적으로 처리하고 next()
호출하여 다음 이벤트로 진행합니다.
int main ()
{
cbor::cbor_bytes_cursor cursor (data);
for (; !cursor. done (); cursor. next ())
{
const auto & event = cursor. current ();
switch (event. event_type ())
{
case staj_event_type::begin_array:
std::cout << event. event_type () << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::end_array:
std::cout << event. event_type () << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::begin_object:
std::cout << event. event_type () << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::end_object:
std::cout << event. event_type () << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::key:
// Or std::string_view, if supported
std::cout << event. event_type () << " : " << event. get <jsoncons::string_view>() << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::string_value:
// Or std::string_view, if supported
std::cout << event. event_type () << " : " << event. get <jsoncons::string_view>() << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::byte_string_value:
std::cout << event. event_type () << " : " << event. get <jsoncons::span< const uint8_t >>() << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::null_value:
std::cout << event. event_type () << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::bool_value:
std::cout << event. event_type () << " : " << std::boolalpha << event. get < bool >() << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::int64_value:
std::cout << event. event_type () << " : " << event. get < int64_t >() << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::uint64_value:
std::cout << event. event_type () << " : " << event. get < uint64_t >() << " " << " ( " << event. tag () << " ) n " ;
break ;
case staj_event_type::half_value:
case staj_event_type::double_value:
std::cout << event. event_type () << " : " << event. get < double >() << " " << " ( " << event. tag () << " ) n " ;
break ;
default :
std::cout << " Unhandled event type " << event. event_type () << " " << " ( " << event. tag () << " ) n " ;
break ;
}
}
}
산출:
begin_array (n/a)
begin_array (n/a)
string_value: foo (n/a)
byte_string_value: 50,75,73,73 (n/a)
string_value: 0x3p-1 (bigfloat)
end_array (n/a)
begin_array (n/a)
string_value: bar (n/a)
byte_string_value: 50,75,73,73 (base64)
string_value: 1.23456789012345678901234567890 (bigdec)
end_array (n/a)
end_array (n/a)
파이프 구문을 사용하여 커서에 필터를 적용할 수 있습니다.
int main ()
{
auto filter = [&]( const staj_event& ev, const ser_context&) -> bool
{
return (ev. tag () == semantic_tag::bigdec) || (ev. tag () == semantic_tag::bigfloat);
};
cbor::cbor_bytes_cursor cursor (data);
auto filtered_c = cursor | filter;
for (; !filtered_c. done (); filtered_c. next ())
{
const auto & event = filtered_c. current ();
switch (event. event_type ())
{
case staj_event_type::string_value:
// Or std::string_view, if supported
std::cout << event. event_type () << " : " << event. get <jsoncons::string_view>() << " " << " ( " << event. tag () << " ) n " ;
break ;
default :
std::cout << " Unhandled event type " << event. event_type () << " " << " ( " << event. tag () << " ) n " ;
break ;
}
}
}
산출:
string_value: 0x3p-1 (bigfloat)
string_value: 1.23456789012345678901234567890 (bigdec)
jsoncons에는 최소한 C++11을 지원하는 컴파일러가 필요합니다. Github Actions 및 Circleci의 지속적인 통합으로 테스트되었습니다. UBSan(UndefineBehaviorSanitizer) 진단은 선택된 gcc 및 clang 빌드에 대해 활성화됩니다. v0.151.0부터 Google OSS-fuzz와 통합되어 모든 파서 및 인코더를 지원합니다.
컴파일러 | 버전 | 기준 | 건축학 | 운영 체제 | CI 서비스 |
---|---|---|---|---|---|
비주얼 스튜디오 | vs2019 | 기본 | x86, x64 | 윈도우 11 | GitHub 작업 |
vs2022 | 기본 | x86, x64 | 윈도우 11 | GitHub 작업 | |
Visual Studio - 땡땡이 | vs2019 | 기본 | x86, x64 | 윈도우 11 | GitHub 작업 |
vs2022 | 기본 | x86, x64 | 윈도우 11 | GitHub 작업 | |
g++ | 6, 7, 8, 9, 10, 11, 12 | 기본 | x64 | 우분투 | 원형 |
g++ | 12 | c++20 | x64 | 우분투 | GitHub 작업 |
그 소리 | 3.9, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | 기본 | x64 | 우분투 | 원형 |
그 소리 | 14 | c++20 | x64 | 우분투 | GitHub 작업 |
xcode를 땡땡이 치다 | 11, 12, 13 | 기본 | x64 | OSX 11 | GitHub 작업 |
xcode를 땡땡이 치다 | 13, 14 | 기본 | x64 | OSX 12 | GitHub 작업 |
CMake는 선택한 컴파일러 환경에 대한 makefile과 솔루션을 생성하는 크로스 플랫폼 빌드 도구입니다. Windows에서는 Windows Installer 패키지를 다운로드할 수 있습니다. Linux에서는 일반적으로 패키지로 제공됩니다. 예를 들어 Ubuntu에서는
sudo apt-get install cmake
cmake가 설치되면 jsoncons 디렉터리에서 단위 테스트를 빌드하고 실행할 수 있습니다.
Windows의 경우:
> mkdir build
> cd build
> cmake .. -DJSONCONS_BUILD_TESTS=On
> cmake --build .
> ctest -C Debug --output-on-failure
UNIX의 경우:
$ mkdir build
$ cd build
$ cmake .. -DJSONCONS_BUILD_TESTS=On
$ cmake --build .
$ ctest --output-on-failure
jsoncons는 오픈 소스 프로젝트에 무료로 제공되는 PVS-Studio 정적 분석기를 사용합니다.
구현 세부 사항에 대한 도움을 주신 comp.lang.c++ 커뮤니티에 큰 감사를 드립니다.
jsoncons 플랫폼 종속 바이너리 구성은 뛰어난 MIT 라이선스 Tincbor를 활용합니다.
벤치마크를 게시하고 결과를 공유하기 위해 이 프로젝트에 연락하여 전반적으로 JSON 라이브러리의 품질을 향상시킨 RapidJSON의 작성자 Milo Yip에게 감사드립니다.
부동 소수점 숫자를 인쇄하기 위한 Grisu3 알고리즘의 jsoncons 구현은 Florian Loitsch의 MIT 라이센스 grisu3_59_56 구현을 약간 수정하여 따릅니다.
매크로 JSONCONS_ALL_MEMBER_TRAITS
Martin York의 ThorsSerializer에서 취한 접근 방식을 따릅니다.
문자열과의 BSON 십진수 128 및 문자열과의 ObjectId의 jsoncons 구현은 Apache 2 라이센스 libbson을 기반으로 합니다.
기여자들에게 특별히 감사드립니다.