jsoncons adalah pustaka C++, khusus header untuk membuat format data mirip JSON dan JSON seperti CBOR. Untuk setiap format data yang didukung, ini memungkinkan Anda bekerja dengan data dalam beberapa cara:
Sebagai struktur data yang mirip varian, sadar pengalokasi, basic_json
Sebagai struktur data C++ yang diketik dengan kuat yang mengimplementasikan json_type_traits
Dengan akses tingkat kursor ke aliran peristiwa parse, agak mirip dengan parsing tarik StAX dan serialisasi push di dunia XML.
Dibandingkan dengan perpustakaan JSON lainnya, jsoncons telah dirancang untuk menangani teks JSON yang sangat besar. Intinya adalah parser dan serializer gaya SAX. Ini mendukung pembacaan seluruh teks JSON di memori dalam struktur seperti varian. Namun ini juga mendukung akses efisien ke data dasar menggunakan penguraian tarik dan serialisasi dorong gaya StAX. Dan mendukung penguraian tambahan ke dalam bentuk pilihan pengguna, menggunakan informasi tentang tipe pengguna yang disediakan oleh spesialisasi json_type_traits.
Model data jsoncons mendukung tipe JSON yang sudah dikenal - null, boolean, angka, string, array, objek - plus string byte. Selain itu, jsoncons mendukung penandaan semantik pada tanggal, waktu, bilangan bulat besar, desimal besar, float besar, dan pengkodean biner. Hal ini memungkinkannya untuk mempertahankan semantik jenis ini saat mengurai format data mirip JSON seperti CBOR yang memilikinya.
jsoncons didistribusikan di bawah Lisensi Perangkat Lunak Boost.
jsoncons gratis tetapi menerima dukungan untuk mempertahankan pengembangannya. Jika Anda merasa perpustakaan ini bermanfaat, mohon pertimbangkan untuk memberikan donasi satu kali atau menjadi ❤️ sponsor.
Seiring berkembangnya perpustakaan jsoncons
, nama terkadang berubah. Untuk memudahkan transisi, jsoncons tidak lagi menggunakan nama-nama lama tetapi terus mendukung banyak nama-nama tersebut. Nama yang tidak digunakan lagi dapat disembunyikan dengan mendefinisikan makro JSONCONS_NO_DEPRECATED
, dan hal ini disarankan untuk kode baru.
"Apache Kvrocks secara konsisten menggunakan jsoncons untuk menawarkan dukungan struktur data JSON kepada pengguna. Kami merasa pengalaman pengembangan dengan jsoncons luar biasa!"
"Saya telah menggunakan perpustakaan Anda dalam bahasa ibu saya – R – dan telah membuat paket R yang memudahkan (a) kueri JMESpath dan JSONpath pada string JSON atau objek R dan (b) bagi pengembang R lainnya untuk menautkan ke perpustakaan Anda ."
"Saya menggunakan perpustakaan Anda sebagai antarmuka eksternal untuk meneruskan data, serta menggunakan konversi dari csv ke json, yang sangat membantu untuk mengonversi data untuk digunakan dalam javascript"
"Diverifikasi bahwa, untuk kebutuhan saya di JSON dan CBOR, ini berfungsi dengan sempurna"
"fitur JSONPath dari perpustakaan ini, luar biasa"
"Kami menggunakan implementasi JMESPath secara ekstensif"
"Kami menyukai validator Skema JSON Anda. Kami menggunakannya di ER/Studio sebagai alat pemodelan data kami untuk mengurai file Skema JSON sehingga kami dapat membuat model relasi entitas dari file tersebut."
"lib serialisasi pilihan dengan pemetaannya yang indah dan kemudahan penggunaan"
"sangat bagus" "proyek yang luar biasa" "sangat solid dan sangat dapat diandalkan" "tim saya menyukainya" "Repo Anda keren!!!!!"
Memulai kumpulan gambar dan bingkai gambar HealthImaging menggunakan AWS SDK
Lisensi CSPro RubyGems.org rjsoncons Coppelia Robotics
Anda dapat menggunakan pengelola perpustakaan platform vcpkg untuk menginstal paket jsoncons.
Atau, unduh rilis terbaru dan ekstrak file zipnya. Salin direktori include/jsoncons
ke direktori include
Anda. Jika Anda ingin menggunakan ekstensi, salin juga include/jsoncons_ext
.
Atau, unduh kode terbaru di main.
Pustaka memerlukan Kompiler C++ dengan dukungan C++11. Selain itu, perpustakaan mendefinisikan jsoncons::endian
, jsoncons::basic_string_view
, jsoncons::optional
, dan jsoncons::span
, yang akan diketik ke perpustakaan standar yang setara jika terdeteksi. Jika tidak, mereka akan diketik ke implementasi internal yang kompatibel dengan C++11.
Perpustakaan menggunakan pengecualian dan dalam beberapa kasus std::error_code's untuk melaporkan kesalahan. Selain jsoncons::assertion_error
, semua kelas pengecualian jsoncons mengimplementasikan antarmuka jsoncons::json_error. Jika pengecualian dinonaktifkan atau jika makro waktu kompilasi JSONCONS_NO_EXCEPTIONS
ditentukan, lemparan menjadi panggilan ke std::terminate
.
json_benchmarks memberikan beberapa pengukuran tentang bagaimana jsoncons
dibandingkan dengan perpustakaan json
lainnya.
Rangkaian pengujian JSONTestSuite dan JSON_checker
Tolok ukur kinerja dengan teks dan bilangan bulat
Tolok ukur kinerja dengan teks dan ganda
Perbandingan JSONPath menunjukkan bagaimana jsoncons JsonPath dibandingkan dengan implementasi lainnya
Bekerja dengan data JSON
Bekerja dengan data CBOR
Untuk contoh di bawah ini Anda perlu menyertakan beberapa file header dan menginisialisasi string data 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 memungkinkan Anda bekerja dengan data dalam beberapa cara:
Sebagai struktur data seperti varian, basic_json
Sebagai struktur data C++ yang diketik dengan kuat yang mengimplementasikan json_type_traits
Dengan akses tingkat kursor ke aliran peristiwa parse
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 " ;
}
Keluaran:
(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 mendukung transformasi teks JSON menjadi struktur data C++. Fungsi decode_json dan encode_json mengonversi string atau aliran data JSON ke struktur data C++ dan sebaliknya. Dekode dan enkode berfungsi untuk semua kelas C++ yang telah menetapkan json_type_traits. jsoncons sudah mendukung banyak tipe di perpustakaan standar, dan tipe Anda sendiri juga akan didukung jika Anda mengkhususkan json_type_traits
di namespace jsoncons
.
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 " ;
}
Keluaran:
(1)
Marilyn C, 0.9, 1514862245
(2)
{
"application": "hiking",
"reputons": [
{
"assertion": "advanced",
"generated": 1514862245,
"rated": "Marilyn C",
"rater": "HikingAsylum",
"rating": 0.9
}
]
}
Contoh ini menggunakan makro praktis JSONCONS_ENUM_TRAITS
, JSONCONS_N_CTOR_GETTER_TRAITS
, dan JSONCONS_ALL_CTOR_GETTER_TRAITS
untuk mengkhususkan json_type_traits untuk tipe enum ns::hiking_experience
, kelas ns::hiking_reputon
(dengan beberapa anggota tidak wajib), dan kelas ns::hiking_reputation
( dengan semua wajib anggota.) Makro JSONCONS_ENUM_TRAITS
menghasilkan kode dari pengidentifikasi enum, dan makro JSONCONS_N_CTOR_GETTER_TRAITS
dan JSONCONS_ALL_CTOR_GETTER_TRAITS
menghasilkan kode dari fungsi get dan konstruktor. Deklarasi makro ini harus ditempatkan di luar blok namespace mana pun.
Lihat contoh cara lain untuk mengkhususkan json_type_traits
.
Aplikasi penguraian tarik pada umumnya akan berulang kali memproses peristiwa current()
dan memanggil next()
untuk melanjutkan ke peristiwa berikutnya, hingga done()
mengembalikan true
.
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 ;
}
}
}
Keluaran:
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
Anda dapat menerapkan filter ke kursor menggunakan sintaksis pipa (misalnya, 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 ;
}
}
}
Keluaran:
Marilyn C
Untuk contoh di bawah ini Anda perlu menyertakan beberapa file header dan menginisialisasi buffer data 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 memungkinkan Anda bekerja dengan data CBOR mirip dengan data JSON:
Sebagai struktur data seperti varian, basic_json
Sebagai struktur data C++ yang diketik dengan kuat yang mengimplementasikan json_type_traits
Dengan akses tingkat kursor ke aliran peristiwa parsing
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 " ;
}
Keluaran:
(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 " ;
}
Keluaran:
(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
Perhatikan bahwa saat mendekode pecahan bigfloat dan desimal menjadi std::string
, kita kehilangan informasi semantik yang disimpan oleh varian seperti struktur data dengan tag, sehingga membuat serial kembali ke CBOR menghasilkan string teks.
Aplikasi penguraian tarik pada umumnya akan berulang kali memproses peristiwa current()
dan memanggil next()
untuk melanjutkan ke peristiwa berikutnya, hingga done()
mengembalikan true
.
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 ;
}
}
}
Keluaran:
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)
Anda dapat menerapkan filter ke kursor menggunakan sintaksis pipa,
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 ;
}
}
}
Keluaran:
string_value: 0x3p-1 (bigfloat)
string_value: 1.23456789012345678901234567890 (bigdec)
jsoncons memerlukan kompiler dengan dukungan minimal C++11. Ini diuji dalam integrasi berkelanjutan di Github Actions dan Circleci. Diagnostik UndefinisiBehaviorSanitizer (UBSan) diaktifkan untuk build gcc dan clang yang dipilih. Sejak v0.151.0, ini terintegrasi dengan Google OSS-fuzz, dengan cakupan untuk semua parser dan encoder.
Penyusun | Versi | Standar | Arsitektur | Sistem Operasi | Layanan CI |
---|---|---|---|---|---|
Studio Visual | vs2019 | bawaan | x86, x64 | jendela 11 | Tindakan GitHub |
vs2022 | bawaan | x86, x64 | jendela 11 | Tindakan GitHub | |
Visual Studio - dentang | vs2019 | bawaan | x86, x64 | jendela 11 | Tindakan GitHub |
vs2022 | bawaan | x86, x64 | jendela 11 | Tindakan GitHub | |
g++ | 6, 7, 8, 9, 10, 11, 12 | bawaan | x64 | Ubuntu | lingkaranci |
g++ | 12 | c++20 | x64 | Ubuntu | Tindakan GitHub |
dentang | 3,9, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | bawaan | x64 | Ubuntu | lingkaranci |
dentang | 14 | c++20 | x64 | Ubuntu | Tindakan GitHub |
dentang xcode | 11, 12, 13 | bawaan | x64 | OS X 11 | Tindakan GitHub |
dentang xcode | 13, 14 | bawaan | x64 | OSX 12 | Tindakan GitHub |
CMake adalah alat pembangunan lintas platform yang menghasilkan makefile dan solusi untuk lingkungan kompiler pilihan Anda. Di Windows Anda dapat mengunduh paket Penginstal Windows. Di Linux biasanya tersedia sebagai sebuah paket, misalnya di Ubuntu,
sudo apt-get install cmake
Setelah cmake diinstal, Anda dapat membuat dan menjalankan pengujian unit dari direktori jsoncons,
Di Windows:
> mkdir build
> cd build
> cmake .. -DJSONCONS_BUILD_TESTS=On
> cmake --build .
> ctest -C Debug --output-on-failure
Di UNIX:
$ mkdir build
$ cd build
$ cmake .. -DJSONCONS_BUILD_TESTS=On
$ cmake --build .
$ ctest --output-on-failure
jsoncons menggunakan penganalisis statis PVS-Studio, yang disediakan gratis untuk proyek sumber terbuka.
Terima kasih banyak kepada komunitas comp.lang.c++ atas bantuannya terkait detail implementasi.
Konfigurasi biner yang bergantung pada platform jsoncons mengacu pada tinycbor berlisensi MIT yang sangat baik.
Terima kasih kepada Milo Yip, penulis RapidJSON, yang telah meningkatkan kualitas pustaka JSON secara menyeluruh, dengan menerbitkan tolok ukur, dan menghubungi proyek ini (antara lain) untuk membagikan hasilnya.
Implementasi jsoncons dari algoritma Grisu3 untuk mencetak angka floating-point mengikuti implementasi grisu3_59_56 berlisensi MIT Florian Loitsch, dengan sedikit modifikasi.
Makro JSONCONS_ALL_MEMBER_TRAITS
mengikuti pendekatan yang diambil oleh ThorsSerializer Martin York
Implementasi jsoncons dari BSON desimal128 ke dan dari string, dan ObjectId ke dan dari string, didasarkan pada libbson berlisensi Apache 2.
Terima kasih khusus kepada kontributor kami