SuperObject.Delphi
1.0.0
Pascal(Delphi、FPC)Json Parser Library SuperObject。
このバージョンは、DelphiとLast FPCのコンフィーラーと互換性があります。
{
"name" : "Jon Snow" , /* this is a comment */
"dead" : true ,
"telephones" : [ "000000000" , "111111111111" ] ,
"age" : 33 ,
"size" : 1.83 ,
"adresses" : [
{
"adress" : "foo" ,
"city" : "The wall" ,
"pc" : 57000
} ,
{
"adress" : "foo" ,
"city" : "Winterfell" ,
"pc" : 44000
}
]
} var
obj: ISuperObject;
begin
obj := SO( ' {"foo": true} ' );
obj := TSuperObject.ParseString( ' {"foo": true} ' );
obj := TSuperObject.ParseStream(stream);
obj := TSuperObject.ParseFile(FileName);
end ;サポートされているデータ型ごとに個々のデータストラクチャはありません。それらはすべてオブジェクトです:isuperobject。
val := obj.AsString;
val := obj.AsInteger;
val := obj.AsBoolean;
val := obj.AsDouble;
val := obj.AsArray;
val := obj.AsObject;
val := obj.AsMethod; val := obj.AsObject.S[ ' foo ' ]; // get a string
val := obj.AsObject.I[ ' foo ' ]; // get an Int64
val := obj.AsObject.B[ ' foo ' ]; // get a Boolean
val := obj.AsObject.D[ ' foo ' ]; // get a Double
val := obj.AsObject.O[ ' foo ' ]; // get an Object (default)
val := obj.AsObject.M[ ' foo ' ]; // get a Method
val := obj.AsObject.N[ ' foo ' ]; // get a null object // the advanced way
val := obj.AsArray.S[ 0 ]; // get a string
val := obj.AsArray.I[ 0 ]; // get an Int64
val := obj.AsArray.B[ 0 ]; // get a Boolean
val := obj.AsArray.D[ 0 ]; // get a Double
val := obj.AsArray.O[ 0 ]; // get an Object (default)
val := obj.AsArray.M[ 0 ]; // get a Method
val := obj.AsArray.N[ 0 ]; // get a null object パスを使用することは、どこにあるかを知っているときにオブジェクトを見つけるための非常に生産的な方法です。これはいくつかの使用法です:
obj[ ' foo ' ]; // get a property
obj[ ' 123 ' ]; // get an item array
obj[ ' foo.list ' ]; // get a property from an object
obj[ ' foo[123] ' ]; // get an item array from an object
obj[ ' foo(1,2,3) ' ]; // call a method
obj[ ' foo[] ' ] := value ; // add an item arrayパスをカプセル化することもできます:
obj := so( ' {"index": 1, "items": ["item 1", "item 2", "item 3"]} ' );
obj[ ' items[index] ' ] // return "item 2"または、別のデータ構造を再作成します。
obj := so( ' {"index": 1, "items": ["item 1", "item 2", "item 3"]} ' );
obj[ ' {"item": items[index], "index": index} ' ] // return {"item": "item 2", "index": 1} Delphiエンクレータを使用すると、同じマナーでアイテムの配列またはプロパティのオブジェクト値を閲覧できます。
var
item: ISuperObject;
begin
for item in obj[ ' items ' ] do ...このようなオブジェクトのキーと値を閲覧することもできます。
var
item: TSuperAvlEntry;
begin
for item in obj.AsObject do ...
begin
item. Name ;
item. Value ;
end ; var
item: TSuperObjectIter;
begin
if ObjectFindFirst(obj, item) then
repeat
item.key;
item.val;
until not ObjectFindNext(item);
ObjectFindClose(item); var
item: Integer;
begin
for item := 0 to obj.AsArray.Length - 1 do
obj.AsArray[item] type
TData = record
str: string;
int: Integer;
bool: Boolean;
flt: Double;
end ;
var
ctx: TSuperRttiContext;
data: TData;
obj: ISuperObject;
begin
ctx := TSuperRttiContext.Create;
try
data := ctx.AsType<TData>(SO( ' {str: "foo", int: 123, bool: true, flt: 1.23} ' ));
obj := ctx.AsJson<TData>(data);
finally
ctx.Free;
end ;
end ; obj.AsJSon(options);
obj.SaveTo(stream);
obj.SaveTo(filename); SO([ ' prop1 ' , true, ' prop2 ' , 123 ]); // return an object {"prop1": true, "prop2": 123}
SA([true, 123 ]); // return an array [true, 123] SuperObjectは、非標準形式を解析することができます。
// unquoted identifiers
SO( ' {foo: true} ' );
// unescaped or unquoted strings
SO( ' {собственность: bla bla bla} ' );
// excadecimal
SO( ' {foo: xFF} ' );JSON文字列を取得します:
function TDataModule3.GetSearchLostStatus: string;
var
X: ISuperObject;
begin
X := SO;
with FServiceThread do
begin
X.B['NowSearchForFile'] := NowSearchForFile;
X.S['LastLostFile'] := LastLostFile;
X.B['NowSearchForRec'] := NowSearchForRec;
X.S['LostRecProgress'] := LostRecProgress;
end;
Result := X.AsJSON;
end;
JSON文字列からデータを戻します:
procedure TForm2.SetSearchLostStatus(const Params: string);
var
s: string;
X: ISuperObject;
begin
X := TSuperObject.ParseString(PChar(Params), True);
FNowSearchForFile := not X.B['NowSearchForFile'];
FLastLostFile := X.S['LastLostFile'];
FNowSearchForRec := X.B['NowSearchForRec'];
FLostRecProgress := X.I['LostRecProgress'];
end;
配列の使用法:
procedure TForm4.SetQueueStatus(const Params: string);
var
j: integer;
X: ISuperObject;
X1: TSuperArray;
s: string;
begin
X := TSuperObject.ParseString(PChar(s), True);
X1 := X.A['Queues'];
StringGrid1.RowCount := X1.Length + 1;
for j := 0 to X1.Length - 1 do
with StringGrid1, X1[j] do
begin
Cells[0, j + 1] := S['NAME'];
if j = 0 then
Cells[1, j + 1] := S['FILES_QUEUED1'] + ' + ' + S['FILES_QUEUED2']
else
Cells[1, j + 1] := S['FILES_QUEUED'];
Cells[2, j + 1] := S['STATUS'];
Cells[3, j + 1] := S['FILES_DONE'];
Cells[4, j + 1] := S['FILES_SKIPPED'];
end;
end;
パスの使用法:
var s: string; json, field: iSuperObject;
....
field := json.O['Document.CurrentItems.DocumentItem.Fields.FieldValue[1].Value'];
s := json.O['Value'].AsString;