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 。