Jsondocは、TmongowireプロジェクトのBsondoc.pasおよびIBSONDocumentとしてスタートしました。 Iunknowns(参照カウント用)とバリアントに基づいた堅実なJSONパーサーであったため(私は本当に、すべてのタイプの過負荷の長いリストが本当に嫌いです)。 Mongodbとは無関係ないくつかのプロジェクトでJSONを操作する必要性が生じたため、 IJSONDocumentの周りに専用のプロジェクトを設定するためにアイデアが浮上しました。
(その動きを完了するために、Tmongowireはその後、 bsonDoc.pas jsonDoc.pasに置き換え、Bsonから変換するために個別の変換関数を置き換えました。)
新しいIJSONDocumentインスタンスを作成するには:
function JSON: IJSONDocument; overload;
新しいIJSONDocumentインスタンスを作成および埋めるには:
function JSON(const x: array of Variant): IJSONDocument; overload;
交互のキーと値のリストを渡し、キーを{埋め込みドキュメントを起動するためにキーを接尾辞し、 }を使用して閉じます。例:with
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ドキュメントを処理する場合、キー(およびその値のバリアントレコード)を保存するためのメモリのde-および再アラージョンを回避することでパフォーマンスを得ることができます。 (以下のIJSONDocArrayも参照)。
キーごとに値を取得します。これがデフォルトのプロパティであるため、インデックス表記(例: d['id'] )によってIJSONDocumentのキーにアクセスできます。
property Item[const Key: WideString]: Variant; default;
注意:デフォルトでは、 IJSONDocument実装: TJSONDocumentはスレッドセーフではありません。適切なロックと同期方法を使用して、1つのスレッドのみが一度にインスタンスにアクセスすることを確認するか、条件付き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は、メモリの使用を節約するために、内部的に文字列との間で変換されます。単一のIJSONDocumentインスタンスを使用してLoadItem使用して、キーを再利用し、メモリの割り当てを保存します。 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] )が機能しなくなったことです。 (これをサポートできるVariantManager 、バージョン7以降Delphiで廃止されます。) ja関数を使用して、型バリアントの変数( ja(a)[i] )の変数からIJSONArrayリファレンスを便利に抽出します。