JSONDOC最初是Tmongowire項目中的Bsondoc.pas和IBSONDocument 。由於它是一個可靠的JSON解析器,因此基於iunknowns(用於參考計數)和變體(我真的非常討厭多種類型的過多載荷)。出現了在與MongoDB無關的幾個項目中操縱JSON的需求,因此,這個想法浮出水面,圍繞IJSONDocument進行了一個專門的項目。
(為了完成此舉,此後,Tmongowire隨後用jsonDoc.pas替換了bsonDoc.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 )。
通過鍵檢索值。這是默認屬性,因此您可以通過索引符號(例如: d['id'] )訪問IJSONDocument的鍵。
property Item[const Key: WideString]: Variant; default;
注意:默認情況下, IJSONDocument實現: TJSONDocument不是線程安全。請使用適當的鎖定和同步方法來確保僅一個線程一次訪問一個實例,或聲明有條件定義JSONDOC_THREADSAFE 。
為IJSONDocument參考創建一個IJSONEnumerator實例。
function JSONEnum(x: IJSONDocument): IJSONEnumerator; overload;
function JSONEnum(const x: Variant): IJSONEnumerator; overload;
檢查枚舉器是否超過了文檔鍵的末端。
function EOF: boolean;
將迭代器移至集合中的下一個項目。將迭代器移至第一個通話中的第一個項目。移動到集合末端時返回false。
function Next: boolean;
返回集合中當前項目的密鑰或值。
function Key: WideString;
function Value: Variant;
返回集合中當前項目的密鑰或值。
使用IJSONDocArray實例存儲一組類似的JSON文檔。 JSON被轉換為內部字符串,以節省內存使用量。將LoadItem與單個IJSONDocument實例一起重複使用密鑰,並保存內存分配。預先加載一個由IJSONDocArray實例的父母IJSONDocument ,以推遲一些兒童文檔的解析。
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值設置為true,以使IJSONDocument使用IJSONArray實例保存數組,該數組使用參考計數而不是分配中的深層複製。
一個缺點是普通的陣列索引( a[i] )不再起作用。 (自版本7 IJSONArray ja(a)[i]可以在Delphi ja對此提供支持的VariantManager 。