حل رأس واحد بسيط لحلية JSON في C و C ++.
يتم تحليل JSON في المخزن المؤقت للتخصيص المفرد للقراءة فقط.
المترجمون المدعومون الحاليون هم GCC و Clang و MSVC.
الأنظمة الأساسية المدعومة الحالية هي Windows و Mac OS و Linux.
فقط #include "json.h" في الكود الخاص بك!
تحليل سلسلة json في دوم.
struct json_value_s * json_parse (
const void * src ,
size_t src_size );src - سلسلة UTF -8 JSON إلى تحليل.src_size - حجم src في البايتات. إرجاع struct json_value_s* يشير إلى جذر json dom.
الهيكل الرئيسي للتفاعل مع نموذج كائن مستند JSON المحسّن (DOM) هو struct json_value_s .
struct json_value_s {
void * payload ;
size_t type ;
};payload - مؤشر لمحتويات القيمة.type - نوع نقاط payload الهيكل ، واحدة من json_type_e . ملاحظة: إذا كان النوع هو json_type_true أو json_type_false أو json_type_null ، فسيكون الحمولة فارغة.تمديد تحليل سلسلة JSON في DOM.
struct json_value_s * json_parse_ex (
const void * src ,
size_t src_size ,
size_t flags_bitset ,
void * ( * alloc_func_ptr )( void * , size_t ),
void * user_data ,
struct json_parse_result_s * result );src - سلسلة UTF -8 JSON إلى تحليل.src_size - حجم src في البايتات.flags_bitset - أعلام التحليل الإضافية ، مجموعة من الأعلام المحددة في enum json_parse_flags_e .alloc_func_ptr - دالة رد الاتصال لاستخدامها للقيام بتخصيص واحد. إذا null ، يتم استخدام malloc() .user_data - يتم تمرير بيانات المستخدم كوسيطة أولى إلى alloc_func_ptr .result - نتيجة التحليل. في حالة حدوث خطأ في التحليل ، سيحتوي هذا على نوع الخطأ ، وأين حدث في المصدر. يمكن أن يكون فارغا. إرجاع struct json_value_s* يشير إلى جذر json dom.
أعلام التحليل الإضافية التي يمكن تحديدها لـ json_parse_ex() هي كما يلي:
enum json_parse_flags_e {
json_parse_flags_default = 0 ,
json_parse_flags_allow_trailing_comma = 0x1 ,
json_parse_flags_allow_unquoted_keys = 0x2 ,
json_parse_flags_allow_global_object = 0x4 ,
json_parse_flags_allow_equals_in_object = 0x8 ,
json_parse_flags_allow_no_commas = 0x10 ,
json_parse_flags_allow_c_style_comments = 0x20 ,
json_parse_flags_deprecated = 0x40 ,
json_parse_flags_allow_location_information = 0x80 ,
json_parse_flags_allow_single_quoted_strings = 0x100 ,
json_parse_flags_allow_hexadecimal_numbers = 0x200 ,
json_parse_flags_allow_leading_plus_sign = 0x400 ,
json_parse_flags_allow_leading_or_trailing_decimal_point = 0x800 ,
json_parse_flags_allow_inf_and_nan = 0x1000 ,
json_parse_flags_allow_multi_line_strings = 0x2000 ,
json_parse_flags_allow_simplified_json =
( json_parse_flags_allow_trailing_comma |
json_parse_flags_allow_unquoted_keys |
json_parse_flags_allow_global_object |
json_parse_flags_allow_equals_in_object |
json_parse_flags_allow_no_commas ),
json_parse_flags_allow_json5 =
( json_parse_flags_allow_trailing_comma |
json_parse_flags_allow_unquoted_keys |
json_parse_flags_allow_c_style_comments |
json_parse_flags_allow_single_quoted_strings |
json_parse_flags_allow_hexadecimal_numbers |
json_parse_flags_allow_leading_plus_sign |
json_parse_flags_allow_leading_or_trailing_decimal_point |
json_parse_flags_allow_inf_and_nan |
json_parse_flags_allow_multi_line_strings )
};json_parse_flags_default - لا يتم تمكين أي سلوك خاص.json_parse_flags_allow_trailing_comma - السماح بفواصل زائدة في الكائنات والصفائف. على سبيل المثال ، سيتم السماح بكل من [true,] و {"a" : null,} مع هذا الخيار.json_parse_flags_allow_unquoted_keys - السماح بمفاتيح غير مؤهلة للكائنات. على سبيل المثال ، سيتم السماح {a : null} باستخدام هذا الخيار.json_parse_flags_allow_global_object - السماح لكائن عالمي غير محصور. على سبيل المثال ، a : null, b : true, c : {} سيتم السماح به مع هذا الخيار.json_parse_flags_allow_equals_in_object - السماح للكائنات باستخدام '=' وكذلك ':' بين أزواج المفتاح/القيمة. على سبيل المثال ، {"a" = null, "b" : true} سيتم السماح به مع هذا الخيار.json_parse_flags_allow_no_commas - السماح بأن الكائنات لا يجب أن يكون لها فواصل فاصلة بين أزواج المفاتيح/القيمة. على سبيل المثال ، {"a" : null "b" : true} سيتم السماح به مع هذا الخيار.json_parse_flags_allow_c_style_comments - السماح بتجاهل التعليقات على طراز C ( // أو /* */ ) في ملف json الإدخال.json_parse_flags_deprecated - خيار تم إهماله.json_parse_flags_allow_location_information - السماح بتتبع معلومات الموقع حيث توجد القيم في json الإدخال. مفيد لتنبيه المستخدمين إلى أخطاء مع معلومات موقع دقيقة تتعلق بالمصدر الأصلي. عند تمكين هذا الخيار ، يمكن إلقاء جميع json_value_s* على json_value_ex_s* ، ويمكن إلقاء json_string_s* من json_object_element_s* العضو على json_string_ex_s* لاسترداد مواقع محددة على جميع القيم والمفاتيح. لاحظ أن هذا الخيار سيزيد من ميزانية الذاكرة المطلوبة لـ DOM المستخدم لتسجيل JSON.json_parse_flags_allow_single_quoted_strings - يتيح أن تكون السلاسل في 'single quotes' .json_parse_flags_allow_hexadecimal_numbers - يسمح باستخدام أرقام سداسية عشرية 0x42 .json_parse_flags_allow_leading_plus_sign - يسمح بتسجيل علامة على أرقام +42 .json_parse_flags_allow_leading_or_trailing_decimal_point - يتيح أن يكون النقاط العشرية في الرصاص أو الأرقام 0 أرقام .42 أو 42. .json_parse_flags_allow_inf_and_nan - يسمح باستخدام معرفات Infinity و NAN Infinity أو NaN .json_parse_flags_allow_multi_line_strings - يسمح للسلاسل بامتداد خطوط متعددة.json_parse_flags_allow_simplified_json - السماح بتحليل JSON المبسط. Simplified JSON هو تمكين لمجموعة من خيارات التحليل الأخرى. شاهد مدونة bitsquid التي تقدم هذا هنا.json_parse_flags_allow_json5 - السماح لـ JSON5 بتحليلها. JSON5 هو تمكين لمجموعة من خيارات التحليل الأخرى. انظر الموقع الذي يحدد هذا الامتداد هنا. json_parseدعنا نقول أن لدينا سلسلة json '{"a": true ، "b": [false ، null ، "foo"]}' . للوصول إلى كل جزء من JSON المحسّنة ، سنفعل:
const char json [] = "{"a" : true, "b" : [false, null, "foo"]}" ;
struct json_value_s * root = json_parse ( json , strlen ( json ));
assert ( root -> type == json_type_object );
struct json_object_s * object = ( struct json_object_s * ) root -> payload ;
assert ( object -> length == 2 );
struct json_object_element_s * a = object -> start ;
struct json_string_s * a_name = a -> name ;
assert ( 0 == strcmp ( a_name -> string , "a" ));
assert ( a_name -> string_size == strlen ( "a" ));
struct json_value_s * a_value = a -> value ;
assert ( a_value -> type == json_type_true );
assert ( a_value -> payload == NULL );
struct json_object_element_s * b = a -> next ;
assert ( b -> next == NULL );
struct json_string_s * b_name = b -> name ;
assert ( 0 == strcmp ( b_name -> string , "b" ));
assert ( b_name -> string_size == strlen ( "b" ));
struct json_value_s * b_value = b -> value ;
assert ( b_value -> type == json_type_array );
struct json_array_s * array = ( struct json_array_s * ) b_value -> payload ;
assert ( array -> length == 3 );
struct json_array_element_s * b_1st = array -> start ;
struct json_value_s * b_1st_value = b_1st -> value ;
assert ( b_1st_value -> type == json_type_false );
assert ( b_1st_value -> payload == NULL );
struct json_array_element_s * b_2nd = b_1st -> next ;
struct json_value_s * b_2nd_value = b_2nd -> value ;
assert ( b_2nd_value -> type == json_type_null );
assert ( b_2nd_value -> payload == NULL );
struct json_array_element_s * b_3rd = b_2nd -> next ;
assert ( b_3rd -> next == NULL );
struct json_value_s * b_3rd_value = b_3rd -> value ;
assert ( b_3rd_value -> type == json_type_string );
struct json_string_s * string = ( struct json_string_s * ) b_3rd_value -> payload ;
assert ( 0 == strcmp ( string -> string , "foo" ));
assert ( string -> string_size == strlen ( "foo" ));
/* Don't forget to free the one allocation! */
free ( root );هناك بعض الوظائف التي لا تخدم أي غرض سوى جعلها أجمل للتكرار من خلال JSON DOM المنتجة:
json_value_as_string - إرجاع قيمة كسلسلة أو خالية إذا لم تكن سلسلة.json_value_as_number - إرجاع قيمة كرقم ، أو فارغ إذا لم يكن رقمًا.json_value_as_object - إرجاع قيمة ككائن ، أو خالية إذا لم يكن كائنًا.json_value_as_array - إرجاع قيمة كصفيف ، أو فارغة إذا لم تكن صفيفًا.json_value_is_true - إرجاع غير صفري كانت قيمة صحيحة ، على خلاف ذلك.json_value_is_false - إرجاع غير صفري كانت قيمة خاطئة ، صفر خلاف ذلك.json_value_is_null - إرجاع غير الصفر هي قيمة كانت خالية ، على خلاف ذلك.دعنا نلقي نظرة على نفس المثال من الأعلى ولكن باستخدام هؤلاء المتكررين المساعد بدلاً من ذلك:
const char json [] = "{"a" : true, "b" : [false, null, "foo"]}" ;
struct json_value_s * root = json_parse ( json , strlen ( json ));
struct json_object_s * object = json_value_as_object ( root );
assert ( object != NULL );
assert ( object -> length == 2 );
struct json_object_element_s * a = object -> start ;
struct json_string_s * a_name = a -> name ;
assert ( 0 == strcmp ( a_name -> string , "a" ));
assert ( a_name -> string_size == strlen ( "a" ));
struct json_value_s * a_value = a -> value ;
assert ( json_value_is_true ( a_value ));
struct json_object_element_s * b = a -> next ;
assert ( b -> next == NULL );
struct json_string_s * b_name = b -> name ;
assert ( 0 == strcmp ( b_name -> string , "b" ));
assert ( b_name -> string_size == strlen ( "b" ));
struct json_array_s * array = json_value_as_array ( b -> value );
assert ( array -> length == 3 );
struct json_array_element_s * b_1st = array -> start ;
struct json_value_s * b_1st_value = b_1st -> value ;
assert ( json_value_is_false ( b_1st_value ));
struct json_array_element_s * b_2nd = b_1st -> next ;
struct json_value_s * b_2nd_value = b_2nd -> value ;
assert ( json_value_is_null ( b_2nd_value ));
struct json_array_element_s * b_3rd = b_2nd -> next ;
assert ( b_3rd -> next == NULL );
struct json_string_s * string = json_value_as_string ( b_3rd -> value );
assert ( string != NULL );
assert ( 0 == strcmp ( string -> string , "foo" ));
assert ( string -> string_size == strlen ( "foo" ));
/* Don't forget to free the one allocation! */
free ( root );كما ترون أنه يجعل التكرار من خلال دوم أكثر متعة قليلا.
إذا كنت ترغب في استخراج قيمة من DOM في تخصيص جديد ، فإن json_extract_value و json_extract_value_ex هل أنت أصدقاء. تتيح لك هذه الوظائف أن تأخذ أي قيمة وشجاعة فرعية من DOM واستنساخها في تخصيص جديد - إما malloc واحد أو منطقة تخصيص مقدمة من المستخدم.
const char json [] = "{"foo" : { "bar" : [123, false, null, true], "haz" : "haha" }}" ;
struct json_value_s * root = json_parse ( json , strlen ( json ));
assert ( root );
struct json_value_s * foo = json_value_as_object ( root ) -> start -> value ;
assert ( foo );
struct json_value_s * extracted = json_extract_value ( foo );
/* We can free root now because we've got a new allocation for extracted! */
free ( root );
assert ( json_value_as_object ( extracted ));
/* Don't forget to free the one allocation! */
free ( extracted );تقوم وظيفة JSON_PARSE باستدعاء Malloc مرة واحدة ، ثم تقوم بتقسيم هذا التخصيص الفردي لدعم جميع هياكل JSON الغريبة والرائعة التي يمكنك تخيلها!
إن بنية البيانات هي دائمًا هياكل JSON أولاً (التي تشفر بنية JSON الأصلية) ، تليها البيانات.
هذا هو برنامج مجاني وغير مدهش تم إصداره في المجال العام.
أي شخص مجاني في نسخ أو تعديل أو نشر أو استخدام أو تجميع أو بيع أو توزيع هذا البرنامج ، إما في شكل رمز المصدر أو بصفته ثنائيًا مجمعًا ، لأي غرض ، تجاري أو غير تجاري ، وأي وسيلة.
في الولايات القضائية التي تعترف بقوانين حقوق الطبع والنشر ، يكرس مؤلف أو مؤلفي هذا البرنامج أي وجميع اهتمامات حقوق الطبع والنشر في البرنامج إلى المجال العام. نجعل هذا التفاني لصالح الجمهور عمومًا وعلى حساب ورثتنا وخلفائنا. نعتزم أن يكون هذا التفاني فعلًا علنيًا للتخلي بشكل دائم من جميع الحقوق الحالية والمستقبلية لهذا البرنامج بموجب قانون حقوق الطبع والنشر.
يتم توفير البرنامج "كما هو" ، دون أي ضمان من أي نوع ، صريح أو ضمني ، بما في ذلك على سبيل المثال لا الحصر ضمانات القابلية للتسويق واللياقة لغرض معين وعدم الانفجار. لن يكون المؤلفون مسؤولين بأي حال من الأحوال عن أي مطالبة أو أضرار أو مسؤولية أخرى ، سواء في إجراء عقد أو ضرر أو غير ذلك ، ناشئة عن البرنامج أو خارجه أو الاستخدام أو التعاملات الأخرى في البرنامج.
لمزيد من المعلومات ، يرجى الرجوع إلى http://unlicense.org/