بدأ JSondoc كـ BSONDOC.PAS و IBSONDocument في مشروع TMONGOWIR. نظرًا لأنه كان محلل JSON قويًا ، استنادًا إلى Iunknowns (للرجوع إلى المرجع) والمتغيرات (أنا حقًا أكره حقًا قوائم طويلة من الأحمال الزائدة لـ allkinds من الأنواع). نشأت الحاجة لمعالجة JSON في العديد من المشاريع التي لا علاقة لها بـ MongoDB ، وبالتالي ظهرت الفكرة على وجود مشروع مخصص حول IJSONDocument .
(لإكمال هذه الخطوة ، قام Tmongowire باستبدال bsonDoc.pas مع jsonDoc.pas ووظائف تحويل منفصلة للتحويل من وإلى BSON.)
لإنشاء مثيل IJSONDocument جديد:
function JSON: IJSONDocument; overload;
لإنشاء وملء مثيل IJSONDocument جديد:
function JSON(const x: array of Variant): IJSONDocument; overload;
تمرير قائمة مفاتيح وقيم بالتناوب ، احتضن المفتاح مع { لبدء مستند مضمن ، واستخدم المفتاح } لإغلاقه. على سبيل المثال: مع
d:=JSON(['a',1,'b{','x','foo','}','c{','x','bar','}','d',VarArrayOf([JSON(['x','hello']),JSON(['y','world'])]),'e',true]);
ستعود d.ToString {"a":1,"b":{"x":"foo"},"c":{"x":"bar"},"d":[{"x":"hello"},{"x":"world"}],"e":true}
تحويل البديل إلى مرجع ijsondocument.
function JSON(x: Variant): IJSONDocument; overload;
اعتمادًا على قيمة الوسيطة:
IJSONDocument جديد ،nil ،IJSONDocument Instace. دمج سلسلة مع بيانات JSON في مثيل IJSONDocument ، ستحصل المفاتيح الحالية على كتابة قيمها (انظر Clear أدناه).
function Parse(const JSONData: WideString): IJSONDocument;
قم بتحويل البيانات في مثيل IJSONDocument إلى سلسلة JSON.
function ToString: WideString;
قم بتحويل البيانات الموجودة في مثيل IJSONDocument إلى مجموعة متغيرة من الأبعاد [0 .. n ، 0..1] ، حيث يحمل [ i ، 0] مفاتيح و [ i ، 1] يحمل القيم.
function ToVarArray: Variant;
امسح قيم IJSONDocument ، ولكن احتفظ بقائمة المفاتيح.
procedure Clear;
عند معالجة سلسلة من مستندات JSON بمجموعة مماثلة من المفاتيح (ومفاتيح المستندات المدمجة) ، يمكن الحصول على الأداء من خلال تجنب إزالة الذاكرة وإعادة تخصيصها لتخزين المفاتيح (والسجل المتغير لقيمها). (انظر أيضا IJSONDocArray أدناه).
استرداد قيمة حسب المفتاح. هذه هي الخاصية الافتراضية ، بحيث يمكنك الوصول إلى مفاتيح IJSONDocument بواسطة تدوين الفهرس (على سبيل المثال: d['id'] ).
property Item[const Key: WideString]: Variant; default;
الانتباه: افتراضيًا ، تطبيق IJSONDocument : TJSONDocument ليس آمنًا لخيط الخيط. يرجى استخدام أساليب القفل والمزامنة المناسبة لضمان الوصول إلى مؤشر ترابط واحد فقط في وقت واحد ، أو إعلان تعريف JSONDOC_THREADSAFE المشروط.
إنشاء مثيل IJSONEnumerator لمرجع IJSONDocument .
function JSONEnum(x: IJSONDocument): IJSONEnumerator; overload;
function JSONEnum(const x: Variant): IJSONEnumerator; overload;
تحقق من أن العداد يتجاوز نهاية مجموعة مفاتيح المستند.
function EOF: boolean;
انقل التكرار إلى العنصر التالي في المجموعة. ينقل التكرار إلى العنصر الأول في المكالمة الأولى. يعود خطأ عند تحركه في نهاية المجموعة.
function Next: boolean;
إرجاع المفتاح أو قيمة العنصر الحالي في المجموعة.
function Key: WideString;
function Value: Variant;
إرجاع المفتاح أو قيمة العنصر الحالي في المجموعة.
استخدم مثيل IJSONDocArray لتخزين مجموعة من مستندات JSON المماثلة. يتم تحويل JSON من وإلى سلاسل داخليًا لتوفير استخدام الذاكرة. استخدم LoadItem مع مثيل IJSONDocument واحد لإعادة استخدام المفاتيح وحفظها على تخصيص الذاكرة. قبل تحميل الوالدين IJSONDocument مع مثيل IJSONDocArray لتأجيل بعض من مستندات الأطفال.
function JSONDocArray: IJSONDocArray; overload;
function JSONDocArray(const Items:array of IJSONDocument): IJSONDocArray; overload;
إلحاق وثيقة إلى الصفيف.
function Add(Doc: IJSONDocument): integer;
function AddJSON(const Data: WideString): integer;
استرجاع مستند باستخدام مثيل IJSONDocument موجود ، ربما إعادة استخدام المفاتيح المخصصة.
procedure LoadItem(Index: integer; Doc: IJSONDocument);
استرداد عدد المستندات في الصفيف.
function Count: integer; stdcall;
قم بتحويل البيانات في مثيل IJSONDocArray إلى سلسلة JSON.
function ToString: WideString; stdcall;
استرجاع مستند عن طريق الفهرس ، في مثيل IJSONDocument جديد. هذه هي الخاصية الافتراضية ، بحيث يمكنك استخدام تدوين الفهرس (على سبيل المثال: a[3] ).
property Item[Idx: integer]: IJSONDocument; default;
إذا كنت بحاجة إلى معالجة المستندات التي تحتوي على العديد من المصفوفات و/أو كبيرة ، فقد يضيع بعض الأداء لأن معالجة المصفوفات المتغيرة تؤدي نسخة عميقة على المهمة افتراضيًا.
لمنع ذلك ، قم بتعيين قيمة JSON_UseIJSONArray إلى TRICE لجعل IJSONDocument تستخدم مثيلات IJSONArray لعقد المصفوفات ، والتي تستخدم العد المرجعي بدلاً من النسخة العميقة على المهمة.
الجانب السلبي لهذا هو أن الفهرسة الصيفية البسيطة ( a[i] ) لم تعد تعمل. (يتم إهمال VariantManager التي يمكن أن توفر الدعم لهذا ، في دلفي منذ الإصدار 7.) استخدم وظيفة ja لاستخراج مرجع IJSONArray مريح من متغير من النوع المتغير ( ja(a)[i] ).