jsoncons هي مكتبة C++، للرأس فقط لإنشاء تنسيقات بيانات JSON وJSON مثل CBOR. بالنسبة لكل تنسيق بيانات مدعوم، فإنه يمكّنك من العمل مع البيانات بعدة طرق:
باعتبارها بنية بيانات تشبه المتغير، وتدرك المخصص، basic_json
باعتبارها بنية بيانات C++ مكتوبة بقوة والتي تطبق json_type_traits
من خلال الوصول على مستوى المؤشر إلى مجموعة من أحداث التحليل، وهو ما يشبه إلى حد ما تحليل سحب StAX وتسلسل الدفع في عالم XML.
بالمقارنة مع مكتبات JSON الأخرى، تم تصميم jsoncons للتعامل مع نصوص JSON الكبيرة جدًا. في قلبها يوجد المحللون والمتسلسلون على طراز SAX. وهو يدعم قراءة نص JSON بالكامل في الذاكرة في بنية تشبه المتغير. ولكنه يدعم أيضًا الوصول الفعال إلى البيانات الأساسية باستخدام تحليل السحب والتسلسل الدفعي بأسلوب StAX. ويدعم التحليل المتزايد في النموذج المفضل للمستخدم، باستخدام معلومات حول أنواع المستخدمين التي توفرها تخصصات json_type_traits.
يدعم نموذج بيانات jsoncons أنواع JSON المألوفة - القيم الخالية، والقيم المنطقية، والأرقام، والسلاسل، والمصفوفات، والكائنات - بالإضافة إلى سلاسل البايت. بالإضافة إلى ذلك، يدعم jsoncons وضع العلامات الدلالية لأوقات التاريخ، وأوقات العصر، والأعداد الصحيحة الكبيرة، والكسور العشرية الكبيرة، والعوامات الكبيرة والترميز الثنائي. وهذا يسمح لها بالحفاظ على دلالات النوع هذه عند تحليل تنسيقات البيانات المشابهة لـ JSON مثل CBOR التي تحتوي عليها.
يتم توزيع jsoncons بموجب ترخيص Boost Software.
jsoncons مجاني ولكنه يرحب بالدعم لمواصلة تطويره. إذا وجدت هذه المكتبة مفيدة، فيرجى التفكير في التبرع لمرة واحدة أو أن تصبح راعيًا ❤️.
مع تطور مكتبة jsoncons
، تغيرت الأسماء في بعض الأحيان. لتسهيل عملية الانتقال، توقف jsoncons الأسماء القديمة ولكنها تستمر في دعم العديد منها. يمكن منع الأسماء المهملة عن طريق تحديد الماكرو JSONCONS_NO_DEPRECATED
، ويوصى بالقيام بذلك للتعليمات البرمجية الجديدة.
"يستخدم Apache Kvrocks باستمرار jsoncons لتقديم الدعم لهياكل بيانات JSON للمستخدمين. ونجد أن تجربة التطوير مع jsoncons رائعة!"
"لقد كنت أستخدم مكتبتك بلغتي الأم - R - وقمت بإنشاء حزمة R تسهل على (أ) استعلامات JMESpath وJSONpath على سلاسل JSON أو كائنات R و(ب) لمطوري R الآخرين الارتباط بمكتبتك ".
"أنا أستخدم مكتبتك كواجهة خارجية لتمرير البيانات، بالإضافة إلى استخدام التحويلات من ملف CSV إلى json، وهي مفيدة حقًا لتحويل البيانات لاستخدامها في جافا سكريبت"
"لقد تحققت من أنه بالنسبة لاحتياجاتي في JSON وCBOR، فهو يعمل بشكل مثالي"
"ميزة JSONPath لهذه المكتبة، إنها رائعة"
"نحن نستخدم تطبيق JMESPath على نطاق واسع جدًا"
"نحن نحب مدقق مخطط JSON الخاص بك. ونحن نستخدمه في ER/Studio أداة نمذجة البيانات الخاصة بنا لتحليل ملفات مخطط JSON حتى نتمكن من إنشاء نماذج علاقات الكيانات منها."
"مكتبة التسلسل المفضلة مع تعييناتها الجميلة وسهولة استخدامها"
"جيد حقًا" "مشروع رائع" "قوي جدًا ويمكن الاعتماد عليه للغاية" "فريقي يحبه" "الريبو الخاص بك رائع!!!!!"
ابدأ مع مجموعات صور HealthImaging وإطارات الصور باستخدام AWS SDK
RubyGems.org rjsoncons تراخيص Coppelia Robotics CSPro
يمكنك استخدام مدير مكتبة النظام الأساسي vcpkg لتثبيت حزمة jsoncons.
أو قم بتنزيل أحدث إصدار وفك ضغط الملف المضغوط. انسخ الدليل include/jsoncons
إلى دليل include
الخاص بك. إذا كنت ترغب في استخدام الملحقات، فانسخ include/jsoncons_ext
أيضًا.
أو قم بتنزيل أحدث كود على main.
تتطلب المكتبة مترجم C++ مع دعم C++11. بالإضافة إلى ذلك، تحدد المكتبة jsoncons::endian
و jsoncons::basic_string_view
و jsoncons::optional
و jsoncons::span
، والتي سيتم تعريفها بمكافئاتها في المكتبة القياسية إذا تم اكتشافها. وإلا فسيتم كتابتها إلى تطبيقات داخلية متوافقة مع C++ 11.
تستخدم المكتبة الاستثناءات وفي بعض الحالات std::error_code's للإبلاغ عن الأخطاء. بصرف النظر عن 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
باعتبارها بنية بيانات C++ مكتوبة بقوة والتي تطبق json_type_traits
مع إمكانية الوصول على مستوى المؤشر إلى مجموعة من أحداث التحليل
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++ والعودة. فك التشفير والتشفير لجميع فئات C++ التي تم تعريف json_type_traits بها. يدعم jsoncons بالفعل العديد من الأنواع في المكتبة القياسية، وسيتم دعم الأنواع الخاصة بك أيضًا إذا قمت بتخصيص json_type_traits
في مساحة الاسم 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 " ;
}
الإخراج:
(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
لتخصيص json_type_traits لنوع التعداد ns::hiking_experience
والفئة ns::hiking_reputon
(مع بعض الأعضاء غير الإلزاميين) والفئة ns::hiking_reputation
(مع جميع الأعضاء الإلزاميين.) يقوم الماكرو JSONCONS_ENUM_TRAITS
بإنشاء التعليمات البرمجية من معرفات التعداد، وتقوم وحدات الماكرو JSONCONS_N_CTOR_GETTER_TRAITS
و JSONCONS_ALL_CTOR_GETTER_TRAITS
بإنشاء التعليمات البرمجية من وظائف get والمنشئ. يجب وضع إعلانات الماكرو هذه خارج أية كتل لمساحة الاسم.
راجع الأمثلة لطرق أخرى لتخصيص json_type_traits
.
سوف يقوم تطبيق تحليل السحب النموذجي بمعالجة الحدث current()
بشكل متكرر واستدعاء next()
للتقدم إلى الحدث التالي، حتى done()
بإرجاع 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 ;
}
}
}
الإخراج:
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 العمل مع بيانات CBOR بشكل مشابه لبيانات JSON:
باعتبارها بنية بيانات تشبه المتغير، basic_json
باعتبارها بنية بيانات C++ مكتوبة بقوة والتي تطبق json_type_traits
مع إمكانية الوصول على مستوى المؤشر إلى مجموعة من أحداث التحليل
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
لاحظ أنه عند فك تشفير الكسر الكبير والكسر العشري إلى std::string
، فإننا نفقد المعلومات الدلالية التي يحتفظ بها المتغير مثل بنية البيانات بعلامة، لذا فإن التسلسل مرة أخرى إلى CBOR ينتج عنه سلسلة نصية.
سوف يقوم تطبيق تحليل السحب النموذجي بمعالجة الحدث current()
بشكل متكرر واستدعاء next()
للتقدم إلى الحدث التالي، حتى done()
بإرجاع 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 ;
}
}
}
الإخراج:
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. يتم تمكين تشخيصات UnifiedBehaviorSanitizer (UBSan) لإصدارات gcc و clang المحددة. منذ الإصدار 0.151.0، تم دمجه مع Google OSS-fuzz، مع تغطية لجميع المحللين اللغويين وأجهزة التشفير.
مترجم | إصدار | معيار | بنيان | نظام التشغيل | خدمة سي.آي |
---|---|---|---|---|---|
الاستوديو المرئي | vs2019 | تقصير | x86، x64 | ويندوز 11 | إجراءات جيثب |
vs2022 | تقصير | x86، x64 | ويندوز 11 | إجراءات جيثب | |
الاستوديو المرئي - رنة | vs2019 | تقصير | x86، x64 | ويندوز 11 | إجراءات جيثب |
vs2022 | تقصير | x86، x64 | ويندوز 11 | إجراءات جيثب | |
ز++ | 6، 7، 8، 9، 10، 11، 12 | تقصير | x64 | أوبونتو | Circleci |
ز++ | 12 | ج++20 | x64 | أوبونتو | إجراءات جيثب |
رنة | 3.9، 4، 5، 6، 7، 8، 9، 10، 11، 12، 13، 14، 15 | تقصير | x64 | أوبونتو | Circleci |
رنة | 14 | ج++20 | x64 | أوبونتو | إجراءات جيثب |
clang xcode | 11، 12، 13 | تقصير | x64 | أو إس إكس 11 | إجراءات جيثب |
clang xcode | 13، 14 | تقصير | x64 | أو إس إكس 12 | إجراءات جيثب |
CMake عبارة عن أداة بناء عبر الأنظمة الأساسية تقوم بإنشاء ملفات تعريفية وحلول لبيئة المترجم التي تختارها. على نظام التشغيل 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 على tinycbor الممتاز المرخص من معهد ماساتشوستس للتكنولوجيا (MIT).
شكرًا لميلو ييب، مؤلف RapidJSON، لرفع جودة مكتبات JSON في جميع المجالات، من خلال نشر المعايير، والاتصال بهذا المشروع (من بين أمور أخرى) لمشاركة النتائج.
يتبع تنفيذ jsoncons لخوارزمية Grisu3 لطباعة أرقام الفاصلة العائمة تنفيذ grisu3_59_56 المرخص من معهد ماساتشوستس للتكنولوجيا لـ Florian Loitsch، مع تعديلات طفيفة.
يتبع الماكرو JSONCONS_ALL_MEMBER_TRAITS
النهج الذي اتبعه ThorsSerializer من Martin York
تعتمد تطبيقات jsoncons لـ BSON decimal128 من وإلى السلسلة، وObjectId من وإلى السلسلة، على libbson المرخص من Apache 2.
شكر خاص للمساهمين لدينا