System.JSON.TJSONPathParser
Delphi
TJSONPathParser = record
public type
TToken = (Undefined, Name, ArrayIndex, Eof, Error);
private
FPathPtr: PChar;
FPtr: PChar;
FEndPtr: PChar;
FTokenArrayIndex: Integer;
FTokenName: string;
FToken: TToken;
function GetIsEof: Boolean; inline;
procedure RaiseError(AMsg: PResStringRec);
procedure RaiseErrorFmt(AMsg: PResStringRec; const AParams: array of const);
procedure ParseName;
procedure ParseQuotedName(AQuote: Char);
procedure ParseArrayIndex;
procedure ParseIndexer;
function EnsureLength(ALength: Integer): Boolean; inline;
procedure FrontTrim(var APtr: PChar); inline;
procedure BackTrim(var APtr: PChar); inline;
public
constructor Create(const APath: string); overload;
constructor Create(const APathPtr: PChar; ALen: Integer); overload;
function NextToken: TToken;
property IsEof: Boolean read GetIsEof;
property Token: TToken read FToken;
property TokenName: string read FTokenName;
property TokenArrayIndex: Integer read FTokenArrayIndex;
end;
C++
struct DECLSPEC_DRECORD TJSONPathParser
{
public:
enum class DECLSPEC_DENUM TToken : unsigned char { Undefined, Name, ArrayIndex, Eof, Error };
private:
System::WideChar *FPathPtr;
System::WideChar *FPtr;
System::WideChar *FEndPtr;
int FTokenArrayIndex;
System::UnicodeString FTokenName;
TToken FToken;
bool __fastcall GetIsEof();
void __fastcall RaiseError(System::PResStringRec AMsg);
void __fastcall RaiseErrorFmt(System::PResStringRec AMsg, const System::TVarRec *AParams, const int AParams_High);
void __fastcall ParseName();
void __fastcall ParseQuotedName(System::WideChar AQuote);
void __fastcall ParseArrayIndex();
void __fastcall ParseIndexer();
bool __fastcall EnsureLength(int ALength);
void __fastcall FrontTrim(System::WideChar * &APtr);
void __fastcall BackTrim(System::WideChar * &APtr);
public:
__fastcall TJSONPathParser(const System::UnicodeString APath)/* overload */;
__fastcall TJSONPathParser(const System::WideChar * APathPtr, int ALen)/* overload */;
TToken __fastcall NextToken();
__property bool IsEof = {read=GetIsEof};
__property TToken Token = {read=FToken};
__property System::UnicodeString TokenName = {read=FTokenName};
__property int TokenArrayIndex = {read=FTokenArrayIndex};
TJSONPathParser() {}
};
プロパティ
種類 | 可視性 | ソース | ユニット | 親 |
---|---|---|---|---|
record struct |
public | System.JSON.pas System.JSON.hpp |
System.JSON | System.JSON |
説明
JSON パスのパーサーです。
JSON パスとは、JSON データ内の特定の項目のパスを定義した文字列です。JSON の JSON パスは、XML の XPath のようなものです。
サポートされている JSON パス構文
TJSONPathParser は、Stefan Göessner によって定義された JSON パス仕様のサブセットを実装しています。特に、サポートされている要素は次のとおりです:
- オブジェクトの子演算子:
.
を使用すると、名前にドットを含んでいないオブジェクトのプロパティにアクセスすることができます。たとえば、root.child
を使用すると、root
オブジェクトのchild
プロパティにアクセスすることができます。.
を使用すると、名前に引用文字を含んでいるオブジェクトのプロパティにアクセスすることができます。 たとえば、root['child.name']
やroot["child.name"]
を使用すると、root
オブジェクトのchild.name
プロパティにアクセスすることができます。
- 配列の添字演算子(
[]
)。たとえば、root[0]
を使用すると、root
配列の最初の項目にアクセスすることができます。
これらの演算子では特別な式をサポートしていません。サポートしているのは実際の値(オブジェクトのプロパティや配列のインデックス)だけです。
TJSONPathParser の使い方
TJSONPathParser のインスタンスを作成するときに、対象の JSON パスをコンストラクタに渡す必要があります。
TJSONPathParser のインスタンスを作成したら、NextToken を呼び出して、IsEof が True
になるか NextToken が Error トークンを返すまで、指定された JSON パスのトークンを反復処理します。
NextToken は、次のトークンのいずれも返すことができます。
トークン | 説明 |
---|---|
|
JSON パス内の次のトークンは、JSON 配列の項目のインデックスです。 TokenArrayIndex は、ターゲットのインデックスを保有します。 |
|
JSON パス内の次のトークンは、JSON オブジェクトのキー/値ペアのキーです。 TokenName には、ターゲットのキーが含まれています。 |
|
JSON パスの最後に到達しました。 パスの走査を続行することはできません。TJSONPathParser のこのインスタンスに NextToken をもう一度呼び出すと、例外が発生します。 |
|
指定された JSON パスにエラーがあります。 パスの走査を続行することはできません。TJSONPathParser のこのインスタンスに NextToken をもう一度呼び出すと、例外が発生します。 |
Token には、最後に NextToken を呼び出したときに返されたトークンが含まれています。
TJSONPathParser の使い方を示すコード例は、TJSONIterator.Find の実装を参照してください。