JSondoc เริ่มต้นจาก BSNONDOC.PAS และ IBSONDocument ในโครงการ TMONGOWIRE เนื่องจากมันเป็นตัวแยกวิเคราะห์ 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 ใหม่nilIJSONDocument 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 โดย Notation INDEX (เช่น: 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;
ตรวจสอบว่า enumerator ผ่านปลายชุดของคีย์ของเอกสาร
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 ให้เป็นจริงเพื่อให้ IJSONDocument ใช้อินสแตนซ์ IJSONArray เพื่อเก็บอาร์เรย์ซึ่งใช้การนับการอ้างอิงแทนสำเนาลึกในการมอบหมาย
ข้อเสียของสิ่งนี้คือการจัดทำดัชนีอาร์เรย์ธรรมดา ( a[i] ) ไม่ทำงานอีกต่อไป ( VariantManager ซึ่งสามารถให้การสนับสนุนสิ่งนี้ได้รับการเลิกใช้ใน Delphi ตั้งแต่เวอร์ชัน 7) ใช้ฟังก์ชั่น ja เพื่อแยกการอ้างอิง IJSONArray จากตัวแปรประเภทตัวแปรประเภท ( ja(a)[i] )