jsoncons は、JSON および CBOR などの JSON に似たデータ形式を構築するための C++ ヘッダーのみのライブラリです。サポートされているデータ形式ごとに、さまざまな方法でデータを操作できるようになります。
バリアントのような、アロケーター対応のデータ構造として、basic_json
json_type_traits を実装する、厳密に型指定された C++ データ構造として
解析イベントのストリームにカーソル レベルでアクセスします。これは、XML の世界における StAX のプル解析とプッシュ シリアル化に似ています。
他の JSON ライブラリと比較して、jsoncons は非常に大きな JSON テキストを処理できるように設計されています。その中心となるのは、SAX スタイルのパーサーとシリアライザーです。バリアントのような構造でメモリ内の JSON テキスト全体を読み取ることができます。ただし、StAX スタイルのプル解析とプッシュ シリアル化を使用した、基礎となるデータへの効率的なアクセスもサポートします。また、json_type_traits の特殊化によって提供されるユーザー タイプに関する情報を使用して、ユーザーの好みの形式への増分解析をサポートします。
jsoncons データ モデルは、よく知られた JSON 型 (null、ブール値、数値、文字列、配列、オブジェクト) に加えてバイト文字列をサポートします。さらに、jsoncons は、日時、エポック時間、大きな整数、大きな小数点、大きな浮動小数点数、およびバイナリ エンコーディングのセマンティック タグ付けをサポートします。これにより、CBOR などの JSON のようなデータ形式を解析するときに、これらの型セマンティクスを保持できるようになります。
jsoncons は Boost Software License に基づいて配布されます。
jsoncons は無料ですが、開発を維持するためのサポートを歓迎します。このライブラリが役に立ったと思われる場合は、1 回限りの寄付をするか、❤️ スポンサーになることをご検討ください。
jsoncons
ライブラリが進化するにつれて、名前が変更されることがあります。移行を容易にするために、jsoncons は古い名前を廃止しますが、それらの多くは引き続きサポートします。非推奨の名前は、マクロJSONCONS_NO_DEPRECATED
を定義することで抑制できます。新しいコードではそうすることをお勧めします。
「Apache Kvrocks は、ユーザーに JSON データ構造のサポートを提供するために、一貫して jsoncons を利用しています。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
を定義します。これらは、検出された場合、標準ライブラリの同等のものに typedefed されます。それ以外の場合は、内部の C++11 互換実装に型定義されます。
ライブラリは例外を使用し、場合によっては std::error_code を使用してエラーを報告します。 jsoncons::assertion_error
とは別に、すべての jsoncons 例外クラスは jsoncons::json_error インターフェースを実装します。例外が無効になっている場合、またはコンパイル時マクロJSONCONS_NO_EXCEPTIONS
が定義されている場合、スローは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
enum 識別子からコードを生成し、マクロ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 データを操作できます。
バリアント的なデータ構造としては、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 での継続的インテグレーションでテストされています。 UnknownBehaviorSanitizer (UBSan) 診断は、選択した gcc ビルドおよび Clang ビルドに対して有効になります。 v0.151.0 以降、Google OSS-fuzz と統合され、すべてのパーサーとエンコーダーをカバーします。
コンパイラ | バージョン | 標準 | 建築 | オペレーティング·システム | CIサービス |
---|---|---|---|---|---|
ビジュアルスタジオ | vs2019 | デフォルト | x86、x64 | Windows 11 | GitHub アクション |
vs2022 | デフォルト | x86、x64 | Windows 11 | GitHub アクション | |
Visual Studio - クラン | vs2019 | デフォルト | x86、x64 | Windows 11 | GitHub アクション |
vs2022 | デフォルト | x86、x64 | Windows 11 | GitHub アクション | |
g++ | 6、7、8、9、10、11、12 | デフォルト | x64 | Ubuntu | サークルシ |
g++ | 12 | c++20 | x64 | Ubuntu | GitHub アクション |
カラン | 3.9、4、5、6、7、8、9、10、11、12、13、14、15 | デフォルト | x64 | Ubuntu | サークルシ |
カラン | 14 | c++20 | x64 | Ubuntu | GitHub アクション |
xcode を鳴らします | 11、12、13 | デフォルト | x64 | OSX11 | GitHub アクション |
xcode を鳴らします | 13、14 | デフォルト | x64 | OSX12 | GitHub アクション |
CMake は、選択したコンパイラ環境用の Makefile とソリューションを生成するクロスプラットフォーム ビルド ツールです。 Windows では、Windows インストーラー パッケージをダウンロードできます。 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 ライセンスの優れた tinycbor を利用しています。
RapidJSON の作者である Milo Yip に感謝します。ベンチマークを公開し、結果を共有するためにこのプロジェクトに連絡し(とりわけ)、JSON ライブラリの品質を全面的に向上させてくれました。
浮動小数点数を出力するための Grisu3 アルゴリズムの jsoncons 実装は、Florian Loitsch の MIT ライセンスを受けた grisu3_59_56 実装に若干の変更を加えたものに従っています。
マクロJSONCONS_ALL_MEMBER_TRAITS
は、Martin York の ThorsSerializer が採用したアプローチに従います。
BSON 128 から文字列への送受信、および ObjectId から文字列への送受信の jsoncons 実装は、Apache 2 ライセンスのライブラリに基づいています。
貢献者に感謝します