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 License
jsoncons เป็นบริการฟรี แต่ยินดีรับการสนับสนุนเพื่อรักษาการพัฒนาไว้ หากคุณพบว่าห้องสมุดนี้มีประโยชน์ โปรดพิจารณาบริจาคครั้งเดียวหรือเป็น ❤️ สปอนเซอร์
เนื่องจากไลบรารี jsoncons
ได้รับการพัฒนา บางครั้งชื่อก็เปลี่ยนไป เพื่อให้การเปลี่ยนแปลงง่ายขึ้น jsoncons จะเลิกใช้ชื่อเก่าแต่ยังคงสนับสนุนชื่อหลายชื่อต่อไป ชื่อที่เลิกใช้แล้วสามารถระงับได้โดยการกำหนดมาโคร JSONCONS_NO_DEPRECATED
และแนะนำให้ทำเช่นนี้สำหรับโค้ดใหม่
"Apache Kvrocks ใช้ jsoncons อย่างต่อเนื่องเพื่อเสนอการสนับสนุนโครงสร้างข้อมูล JSON ให้กับผู้ใช้ เราพบว่าประสบการณ์การพัฒนาด้วย jsoncons โดดเด่น!"
"ฉันใช้ไลบรารีของคุณในภาษาแม่ของฉัน – R – และได้สร้างแพ็คเกจ R ทำให้เป็นเรื่องง่ายสำหรับ (a) การสืบค้น JMESpath และ JSONpath บนสตริง JSON หรืออ็อบเจ็กต์ R และ (b) สำหรับนักพัฒนา R คนอื่น ๆ เพื่อเชื่อมโยงไปยังไลบรารีของคุณ ”
"ฉันใช้ไลบรารีของคุณสำหรับอินเทอร์เฟซภายนอกในการส่งข้อมูล รวมถึงการใช้การแปลงจาก csv เป็น json ซึ่งมีประโยชน์มากสำหรับการแปลงข้อมูลเพื่อใช้ใน javascript"
"ตรวจสอบแล้วว่าสำหรับความต้องการของฉันใน JSON และ CBOR มันทำงานได้อย่างสมบูรณ์แบบ"
"ฟีเจอร์ JSONPath ของไลบรารีนี้เยี่ยมมาก"
"เราใช้การใช้งาน JMESPath ค่อนข้างกว้างขวาง"
"เราชอบเครื่องมือตรวจสอบ JSON Schema ของคุณ เราใช้มันใน ER/Studio เครื่องมือสร้างแบบจำลองข้อมูลของเราเพื่อแยกวิเคราะห์ไฟล์ JSON Schema เพื่อให้เราสามารถสร้างแบบจำลองความสัมพันธ์เอนทิตีจากสิ่งเหล่านั้นได้"
"lib การทำให้ซีเรียลไลซ์เป็นตัวเลือกพร้อมการแมปที่สวยงามและใช้งานง่าย"
"ดีจริงๆ" "โครงการที่ยอดเยี่ยม" "มั่นคงและเชื่อถือได้มาก" "ทีมของฉันชอบมันมาก" "ซื้อคืนของคุณเจ๋งมาก!!!!!"
เริ่มต้นใช้งานชุดรูปภาพและเฟรมรูปภาพ HealthImaging โดยใช้ AWS SDK
RubyGems.org rjsoncons ใบอนุญาต Coppelia Robotics CSPro
คุณสามารถใช้ตัวจัดการไลบรารีแพลตฟอร์ม vcpkg เพื่อติดตั้งแพ็คเกจ jsoncons
หรือดาวน์โหลดรุ่นล่าสุดแล้วแตกไฟล์ zip คัดลอกไดเร็กทอรี include/jsoncons
ไปยังไดเร็กทอรี include
ของคุณ หากคุณต้องการใช้ส่วนขยาย ให้คัดลอก include/jsoncons_ext
ด้วย
หรือดาวน์โหลดโค้ดล่าสุดได้ที่หน้าหลัก
ไลบรารีต้องการคอมไพเลอร์ 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 สำหรับประเภท enum ns::hiking_experience
คลาส ns::hiking_reputon
(ที่มีสมาชิกที่ไม่จำเป็นบางส่วน) และคลาส ns::hiking_reputation
(พร้อมสมาชิกบังคับทั้งหมด) มาโคร JSONCONS_ENUM_TRAITS
สร้างโค้ดจากตัวระบุ enum และมาโคร 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
โปรดทราบว่าเมื่อถอดรหัส bigfloat และเศษส่วนทศนิยมให้เป็น 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 เปิดใช้งานการวินิจฉัย UndefiorSanitizer (UBSan) สำหรับ gcc และ clang ที่เลือก ตั้งแต่เวอร์ชัน 0.151.0 เป็นต้นไป จะมีการผสานรวมเข้ากับ Google OSS-fuzz โดยมีความครอบคลุมสำหรับ parsers และ encoders ทั้งหมด
คอมไพเลอร์ | เวอร์ชัน | มาตรฐาน | สถาปัตยกรรม | ระบบปฏิบัติการ | ซีไอ เซอร์วิส |
---|---|---|---|---|---|
วิชวลสตูดิโอ | เทียบกับ2019 | ค่าเริ่มต้น | x86,x64 | วินโดวส์ 11 | การดำเนินการ GitHub |
เทียบกับปี 2022 | ค่าเริ่มต้น | x86,x64 | วินโดวส์ 11 | การดำเนินการ GitHub | |
Visual Studio - เสียงดังกราว | เทียบกับ2019 | ค่าเริ่มต้น | x86,x64 | วินโดวส์ 11 | การดำเนินการ GitHub |
เทียบกับปี 2022 | ค่าเริ่มต้น | x86,x64 | วินโดวส์ 11 | การดำเนินการ GitHub | |
ก++ | 6, 7, 8, 9, 10, 11, 12 | ค่าเริ่มต้น | x64 | อูบุนตู | วงกลมซี |
ก++ | 12 | ค++20 | x64 | อูบุนตู | การดำเนินการ GitHub |
เสียงดังกราว | 3.9, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | ค่าเริ่มต้น | x64 | อูบุนตู | วงกลมซี |
เสียงดังกราว | 14 | ค++20 | x64 | อูบุนตู | การดำเนินการ GitHub |
เสียงดังกราว xcode | 11, 12, 13 | ค่าเริ่มต้น | x64 | OSX11 | การดำเนินการ GitHub |
เสียงดังกราว xcode | 13, 14 | ค่าเริ่มต้น | x64 | OSX12 | การดำเนินการ GitHub |
CMake เป็นเครื่องมือสร้างข้ามแพลตฟอร์มที่สร้าง makefile และโซลูชันสำหรับสภาพแวดล้อมคอมไพเลอร์ที่คุณเลือก บน Windows คุณสามารถดาวน์โหลดแพ็คเกจ Windows Installer ได้ บน Linux โดยปกติจะมีให้บริการเป็นแพ็คเกจ เช่น บน Ubuntu
sudo apt-get install cmake
เมื่อติดตั้ง cmake แล้ว คุณสามารถสร้างและรันการทดสอบหน่วยจากไดเร็กทอรี jsoncons
บนวินโดวส์:
> mkdir build
> cd build
> cmake .. -DJSONCONS_BUILD_TESTS=On
> cmake --build .
> ctest -C Debug --output-on-failure
บนยูนิกซ์:
$ mkdir build
$ cd build
$ cmake .. -DJSONCONS_BUILD_TESTS=On
$ cmake --build .
$ ctest --output-on-failure
jsoncons ใช้ตัววิเคราะห์คงที่ PVS-Studio ซึ่งให้บริการฟรีสำหรับโปรเจ็กต์โอเพ่นซอร์ส
ขอขอบคุณอย่างยิ่งต่อชุมชน comp.lang.c++ สำหรับความช่วยเหลือเกี่ยวกับรายละเอียดการใช้งาน
การกำหนดค่าไบนารี่ที่ขึ้นอยู่กับแพลตฟอร์ม jsoncons นำมาใช้กับ Tinycbor ที่ได้รับอนุญาตจาก MIT ที่ยอดเยี่ยม
ขอขอบคุณ Milo Yip ผู้เขียน RapidJSON ที่ยกระดับคุณภาพของไลบรารี JSON ทั่วทั้งกระดาน โดยการเผยแพร่เกณฑ์มาตรฐาน และติดต่อโครงการนี้ (รวมถึงโครงการอื่นๆ) เพื่อแบ่งปันผลลัพธ์
การใช้งาน jsoncons ของอัลกอริธึม Grisu3 สำหรับการพิมพ์ตัวเลขทศนิยมเป็นไปตามการใช้งาน grisu3_59_56 ที่ได้รับอนุญาตของ MIT ของ Florian Loitsch โดยมีการแก้ไขเล็กน้อย
มาโคร JSONCONS_ALL_MEMBER_TRAITS
เป็นไปตามแนวทางที่ดำเนินการโดย ThorsSerializer ของ Martin York
การใช้งาน jsoncons ของ BSON decimal128 ถึงและจากสตริง และ ObjectId ถึงและจากสตริง อิงตาม libbson ที่ได้รับอนุญาตของ Apache 2
ขอขอบคุณเป็นพิเศษสำหรับผู้มีส่วนร่วมของเรา