JSonstream هي مكتبة توفر واجهة برمجة تطبيقات تدفق منخفضة المستوى لقراءة وكتابة علامة JSON. لا يحدث التسلسل التلقائي أو إزالة التسلسل ولا يتم إنشاء أي كائنات في الذاكرة. نتيجة لذلك ، هناك القليل جدًا من النفقات العامة ويمكنك حتى التعامل مع علامة JSON كبيرة جدًا لتناسب الذاكرة. المحلل المحلل هو أيضًا متسامح مع الأخطاء ويمكنه الإبلاغ والاسترداد من بعض الأخطاء مثل التعشيش غير الصحيحة أو الفاصلة المفقودة. إنه سهل الاستخدام والتكيف مع حالات الاستخدام الخاصة بك.
تقوم مكتبات JSON الأخرى بالكثير من الأشياء في وقت واحد. عند تحليل JSON ، لا يتم تحليلهم فحسب ، بل يقومون أيضًا بتحويل العلامات إلى شجرة كائن ، أو حتى استخدام الانعكاس/RTTI لخريطة خريطة تلقائيًا بين كائناتك الخاصة وتمثيل JSON الخاص بهم. المحلل في JSonstream من ناحية أخرى هو مجرد محلل. ما تفعله بالبيانات متروك لك تمامًا. هذا يعني أيضًا أن الفصول/الهياكل/السجلات الخاصة بك لا يجب أن تكون تمثيلًا 1: 1 لـ JSON ، والذي يمكن أن يكون مفيدًا جدًا عند العمل مع واجهات برمجة تطبيقات JSON الحالية.
في حين أن مكتبات JSON الأخرى تجبرك على تحديد بنية JSON بشكل إعلاني ، يتم تعريف الهيكل في jsonstream على أنه رمز ، مما يجعله أكثر مرونة وتعبيرية. على سبيل المثال ، إذا كانت هناك قيمة قد تكون إما null أو عدد صحيح ، فيمكنك ببساطة اختبارها ، بدلاً من الاضطرار إلى الإعلان عن نوع Nullable<int> مع مجموعة من الأساليب المحملة. عندما تصبح مواصفات JSON أكثر تعقيدًا ، يصعب قراءة النهج التصريحي الذي اتبعته المكتبات الأخرى وصيانته ، ويؤدي إلى الكثير من كود الغلاية. ينتهي بك الأمر إلى كتابة رمز تكامل Turing باستخدام بناء جملة القالب ، وهو ليس ما تريده. من ناحية أخرى ، يتيح لك JSonstream استخدام لغة Turing-Complete بالفعل تحت تصرفك.
قراءة:
var
s: string;
i: integer;
...
begin
Stream := TStringStream.Create( ' ["Hello", "World", 42] ' );
Reader := TJsonReader.Create(Stream);
if Reader.List then
while Reader.Advance <> jsListEnd do
begin
if Reader.Str(s) then
WriteLn(s)
else if Reader.Number(i) then
WriteLn(i)
end ;
end ;كتابة:
begin
Stream := TIOStream.Create(iosOutput);
Writer := TJsonWriter.Create(Stream,[],true);
Writer.Dict;
Writer.Key( ' Hello ' );
Writer.Str( ' World ' );
Writer.Key( ' Flag ' );
Writer.Bool(true);
Writer.Key( ' Numbers ' );
Writer.List;
Writer.Number( 1 );
Writer.Number( 2 );
Writer.Number( 3 );
Writer.ListEnd;
Writer.DictEnd;
end ;=>
{
"Hello" : " World " ,
"Flag" : true ,
"Numbers" : [
1 ,
2 ,
3
]
}ابحث عن المزيد من الأمثلة هنا.
يمكن لهذه المكتبة قراءة وكتابة المعايير التالية:
يلتزم عن كثب بالمعايير ويمكن استخدامها للتحقق من صحة أو تعقيم علامة JSON. يمكن أن تستمر حتى التحليل بعد خطأ ، إذا رغبت في ذلك. انظر مثال لمثل هذا الاستخدام في Pascal/مثال/jsonecho.
يمكن للمكتبة معالجة المدخلات التعسفية مع خصائص وقت التشغيل المتوقع. يمكن معالجة الأوتار ومفاتيح الكائنات قطعة من حيث القمامة باستخدام الأساليب StrBuf و KeyBuf ، وبالتالي لا يجب أن تكون في الذاكرة في مجملها. تشبه دلالات هذه الوظائف read syscall على أنظمة POSIX.
يتم تحديد الوقت المطلوب لتحليل ملف JSON بواسطة O (n + e*k) ، حيث N هو الطول في البايتات ، e هو عدد الأخطاء التي تم تصحيحها و k هو أقصى عمق التعشيش. بالنسبة لمعظم حالات الاستخدام ، فإن الإجهاض على الخطأ الأول أمر جيد (وهو أيضًا افتراضي) ، وفي هذه الحالة يصبح وقت التشغيل O (N). يستخدم استخدام الذاكرة O (K). يمكنك تحديد أقصى عمق تعشيش مسموح به أثناء التهيئة. سيقوم المحللون بعد ذلك بإجهاض بمجرد الوصول إلى هذا الحد.
يمكن أن يكون الإخراج مطبوعًا جدًا إذا رغبت في ذلك أو استخدام تمثيل مضغوط بدون مساحة بيضاء إضافية.
يحتوي هذا المستودع على مجلدات فرعية للتطبيقات اللغوية المختلفة للمكتبة. حاليًا ، يتم كتابة التنفيذ الوحيد في Pascal ، ولكن يتم التخطيط للتطبيقات الأخرى (على سبيل المثال C).
المجلدات الفرعية:
| مجلد | وصف |
|---|---|
| باسكال | تنفيذ Pascal من JSonstream |
هذا المشروع مرخص بموجب ترخيص معهد ماساتشوستس للتكنولوجيا.
Copyright 2021 Philip Zander
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.