Jsondoc dimulai sebagai bsondoc.pas dan IBSONDocument dalam proyek Tmongowire. Karena itu adalah parser JSON yang solid, berdasarkan pada iunknowns (untuk penghitungan referensi) dan varian (saya benar -benar benar -benar membenci daftar panjang kelebihan untuk semua jenis). Kebutuhan muncul untuk memanipulasi JSON di beberapa proyek yang tidak terkait dengan MongoDB, sehingga gagasan itu muncul untuk memiliki proyek khusus di sekitar IJSONDocument .
(Untuk menyelesaikan langkah, Tmongowire sejak saat itu menggantikan bsonDoc.pas dengan jsonDoc.pas dan fungsi konversi terpisah untuk dikonversi dari dan ke BSON.)
Untuk membuat instance IJSONDocument baru:
function JSON: IJSONDocument; overload;
Untuk membuat dan mengisi instance IJSONDocument baru:
function JSON(const x: array of Variant): IJSONDocument; overload;
Lewati daftar kunci dan nilai bergantian, sufiks kunci dengan { untuk memulai dokumen tertanam, dan gunakan kunci } untuk menutupnya. Misalnya: dengan
d:=JSON(['a',1,'b{','x','foo','}','c{','x','bar','}','d',VarArrayOf([JSON(['x','hello']),JSON(['y','world'])]),'e',true]);
d.ToString akan mengembalikan {"a":1,"b":{"x":"foo"},"c":{"x":"bar"},"d":[{"x":"hello"},{"x":"world"}],"e":true} .
Konversi varian menjadi referensi ijsondocument.
function JSON(x: Variant): IJSONDocument; overload;
Tergantung pada nilai argumen:
IJSONDocument baru,nil ,IJSONDocument . Gabungkan string dengan data JSON ke dalam instance IJSONDocument , kunci yang ada akan mendapatkan nilai -nilainya ditimpa (lihat Clear di bawah).
function Parse(const JSONData: WideString): IJSONDocument;
Konversi data dalam instance IJSONDocument menjadi string JSON.
function ToString: WideString;
Konversi data dalam instance IJSONDocument menjadi array varian dimensi [0 .. n , 0..1], di mana [ i , 0] memegang kunci dan [ i , 1] memegang nilai.
function ToVarArray: Variant;
Hapus nilai -nilai IJSONDocument , tetapi simpan daftar kunci.
procedure Clear;
Saat memproses urutan dokumen JSON dengan serangkaian kunci yang sama (dan kunci dokumen tertanam), kinerja dapat diperoleh dengan menghindari de- dan alokasi memori untuk menyimpan kunci (dan catatan varian untuk nilai-nilai mereka). (Lihat juga IJSONDocArray di bawah).
Mengambil nilai dengan kunci. Ini adalah properti default, sehingga Anda dapat mengakses kunci IJSONDocument dengan notasi indeks (misalnya: d['id'] ).
property Item[const Key: WideString]: Variant; default;
Perhatian: Secara default IJSONDocument Implementasi: TJSONDocument tidak aman. Harap gunakan metode penguncian dan sinkronisasi yang tepat untuk memastikan hanya satu utas yang mengakses instance pada satu waktu, atau menyatakan kondisional JSONDOC_THREADSAFE .
Buat instance IJSONEnumerator untuk referensi IJSONDocument .
function JSONEnum(x: IJSONDocument): IJSONEnumerator; overload;
function JSONEnum(const x: Variant): IJSONEnumerator; overload;
Periksa apakah enumerator sudah melewati akhir set kunci dokumen.
function EOF: boolean;
Pindahkan iterator ke item berikutnya di set. Pindahkan iterator ke item pertama pada panggilan pertama. Mengembalikan false ketika bergerak melewati akhir set.
function Next: boolean;
Mengembalikan kunci atau nilai item saat ini dalam set.
function Key: WideString;
function Value: Variant;
Mengembalikan kunci atau nilai item saat ini dalam set.
Gunakan instance IJSONDocArray untuk menyimpan satu set dokumen JSON yang serupa. JSON dikonversi ke dan dari string secara internal untuk menghemat penggunaan memori. Gunakan LoadItem dengan instance IJSONDocument tunggal untuk menggunakan kembali kunci dan menyimpan alokasi memori. Pra-muat orang tua IJSONDocument dengan instance IJSONDocArray untuk menunda beberapa penguraian dokumen anak-anak.
function JSONDocArray: IJSONDocArray; overload;
function JSONDocArray(const Items:array of IJSONDocument): IJSONDocArray; overload;
Tambahkan dokumen ke array.
function Add(Doc: IJSONDocument): integer;
function AddJSON(const Data: WideString): integer;
Ambil dokumen menggunakan instance IJSONDocument yang ada, mungkin menggunakan kembali kunci yang dialokasikan.
procedure LoadItem(Index: integer; Doc: IJSONDocument);
Ambil jumlah dokumen dalam array.
function Count: integer; stdcall;
Konversi data dalam instance IJSONDocArray menjadi string JSON.
function ToString: WideString; stdcall;
Ambil dokumen berdasarkan indeks, dalam instance IJSONDocument baru. Ini adalah properti default, sehingga Anda dapat menggunakan notasi indeks (misalnya: a[3] ).
property Item[Idx: integer]: IJSONDocument; default;
Jika Anda perlu memproses dokumen yang berisi banyak dan/atau array besar, beberapa kinerja mungkin hilang karena memanipulasi array varian melakukan salinan yang dalam pada penugasan secara default.
Untuk mencegah ini, atur nilai JSON_UseIJSONArray ke True agar IJSONDocument menggunakan instance IJSONArray untuk menahan array, yang menggunakan penghitungan referensi alih -alih salinan yang dalam pada penugasan.
Kelemahan dari ini adalah pengindeksan array biasa ( a[i] ) tidak lagi berfungsi. ( VariantManager yang dapat memberikan dukungan untuk ini, sudah usang di Delphi sejak versi 7.) Gunakan fungsi ja untuk dengan mudah mengekstrak referensi IJSONArray dari variabel varian tipe ( ja(a)[i] ).