|
@@ -0,0 +1,364 @@
|
|
|
+program demortti;
|
|
|
+
|
|
|
+{$mode objfpc}{$H+}
|
|
|
+
|
|
|
+uses
|
|
|
+ Classes, SysUtils, fpjson, fpjsonrtti, variants;
|
|
|
+
|
|
|
+{$R *.res}
|
|
|
+
|
|
|
+Var
|
|
|
+ JS : TJSONStreamer;
|
|
|
+
|
|
|
+Type
|
|
|
+
|
|
|
+ { TTestItem }
|
|
|
+
|
|
|
+ TTestItem = Class(TCollectionItem)
|
|
|
+ private
|
|
|
+ FStrProp: String;
|
|
|
+ Published
|
|
|
+ Property StrProp : String Read FStrProp Write FStrProp;
|
|
|
+ end;
|
|
|
+
|
|
|
+ { TCollComponent }
|
|
|
+
|
|
|
+ TCollComponent = Class(TComponent)
|
|
|
+ private
|
|
|
+ FCollProp: TCollection;
|
|
|
+ Published
|
|
|
+ Property CollProp : TCollection Read FCollProp Write FCollProp;
|
|
|
+ end;
|
|
|
+
|
|
|
+ { TCompComponent }
|
|
|
+
|
|
|
+ TCompComponent = Class(TComponent)
|
|
|
+ private
|
|
|
+ FCompProp: TComponent;
|
|
|
+ Published
|
|
|
+ Property CompProp : TComponent Read FCompProp Write FCompProp;
|
|
|
+ end;
|
|
|
+
|
|
|
+ TDice = (one,two,three,four,five,six);
|
|
|
+ TThrow = Set of TDice;
|
|
|
+
|
|
|
+ { TEnumComponent }
|
|
|
+
|
|
|
+ TEnumComponent = Class(TComponent)
|
|
|
+ private
|
|
|
+ FDice: TDice;
|
|
|
+ Published
|
|
|
+ Property Dice : TDice Read FDice Write FDice;
|
|
|
+ end;
|
|
|
+
|
|
|
+ { TSetComponent }
|
|
|
+
|
|
|
+ TSetComponent = Class(TComponent)
|
|
|
+ private
|
|
|
+ FThrow: TThrow;
|
|
|
+ Published
|
|
|
+ Property Throw : TThrow Read FThrow Write FThrow;
|
|
|
+ end;
|
|
|
+
|
|
|
+ { TChildComponent }
|
|
|
+
|
|
|
+ TChildComponent = Class(TComponent)
|
|
|
+ Protected
|
|
|
+ procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
|
|
|
+ end;
|
|
|
+
|
|
|
+ { TChildComponent }
|
|
|
+
|
|
|
+ procedure TChildComponent.GetChildren(Proc: TGetChildProc; Root: TComponent);
|
|
|
+
|
|
|
+ Var
|
|
|
+ I : Integer;
|
|
|
+
|
|
|
+ begin
|
|
|
+ Writeln('Children',ComponentCount);
|
|
|
+ For I:=0 to ComponentCount-1 do
|
|
|
+ Proc(Components[i]);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+Procedure DumpObject(const Header : String; var O : TJSONData);
|
|
|
+
|
|
|
+begin
|
|
|
+ Writeln(Header,' : ');
|
|
|
+ Writeln(O.FormatJSON());
|
|
|
+ writeln();
|
|
|
+ FreeAndNil(O);
|
|
|
+ JS.Options:=[];
|
|
|
+end;
|
|
|
+
|
|
|
+Procedure DemoObject;
|
|
|
+
|
|
|
+Var
|
|
|
+ C : TComponent;
|
|
|
+ O : TJSONData;
|
|
|
+
|
|
|
+begin
|
|
|
+ C:=TComponent.Create(Nil);
|
|
|
+ try
|
|
|
+ C.Name:='DemoComponent';
|
|
|
+ C.Tag:=23;
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Complete component',O);
|
|
|
+ finally
|
|
|
+ FreeAndNil(C);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+Procedure DemoComponentObject;
|
|
|
+
|
|
|
+Var
|
|
|
+ C : TCompComponent;
|
|
|
+ O : TJSONData;
|
|
|
+
|
|
|
+begin
|
|
|
+ C:=TCompComponent.Create(Nil);
|
|
|
+ try
|
|
|
+ C.Name:='DemoComponent';
|
|
|
+ C.Tag:=23;
|
|
|
+ C.CompProp:=TCompComponent.Create(C);
|
|
|
+ C.CompProp.Name:='SubComponent';
|
|
|
+ C.CompProp.Tag:=45;
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Component-valued property',O);
|
|
|
+ TCompComponent(C.CompProp).FComponentStyle:=[csSubComponent];
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Component-valued property, csSubComponent in Componentstyle',O);
|
|
|
+ TCompComponent(C.CompProp).FComponentStyle:=[];
|
|
|
+ JS.options:=[jsoComponentsInline];
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Component-valued property, options:=[jsoComponentsInline] ',O);
|
|
|
+ finally
|
|
|
+ FreeAndNil(C);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+Procedure DemoChildObject;
|
|
|
+
|
|
|
+Var
|
|
|
+ C : TChildComponent;
|
|
|
+ O : TJSONData;
|
|
|
+
|
|
|
+begin
|
|
|
+ C:=TChildComponent.Create(Nil);
|
|
|
+ try
|
|
|
+ C.Name:='ParentComponent';
|
|
|
+ C.Tag:=23;
|
|
|
+ With TComponent.Create(C) do
|
|
|
+ begin
|
|
|
+ Name:='Child1';
|
|
|
+ Tag:=1;
|
|
|
+ end;
|
|
|
+ With TComponent.Create(C) do
|
|
|
+ begin
|
|
|
+ Name:='Child2';
|
|
|
+ Tag:=2;
|
|
|
+ end;
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Component with children, default options',O);
|
|
|
+ JS.Options:=[jsoStreamChildren];
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Component with children, Options:=[jsoStreamChildren]',O);
|
|
|
+ finally
|
|
|
+ FreeAndNil(C);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+Procedure DemoEnumObject;
|
|
|
+
|
|
|
+Var
|
|
|
+ C : TEnumComponent;
|
|
|
+ O : TJSONData;
|
|
|
+
|
|
|
+begin
|
|
|
+ C:=TEnumComponent.Create(Nil);
|
|
|
+ try
|
|
|
+ C.Dice:=Three;
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Enumerated-typed property, default settings',O);
|
|
|
+ JS.Options:=[jsoEnumeratedAsInteger];
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Enumerated-typed property, Options:=[jsoEnumeratedAsInteger];',O);
|
|
|
+ finally
|
|
|
+ FreeAndNil(C);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+Procedure DemoSetObject;
|
|
|
+
|
|
|
+Var
|
|
|
+ C : TSetComponent;
|
|
|
+ O : TJSONData;
|
|
|
+
|
|
|
+begin
|
|
|
+ C:=TSetComponent.Create(Nil);
|
|
|
+ try
|
|
|
+ C.Throw:=[two,five];
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('set-typed property, default settings',O);
|
|
|
+ JS.Options:=[jsoSetAsString];
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Set-typed property, Options:=[jsoSetAsString];',O);
|
|
|
+ JS.Options:=[jsoSetAsString,jsoSetBrackets];
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Set-typed property, Options:=[jsoSetAsString,jsoSetBrackets];',O);
|
|
|
+ JS.Options:=[jsoSetEnumeratedAsInteger];
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Set-typed property, Options:=[jsoSetEnumeratedAsInteger];',O);
|
|
|
+ finally
|
|
|
+ FreeAndNil(C);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+Procedure DemoObjectAsString;
|
|
|
+
|
|
|
+Var
|
|
|
+ C : TComponent;
|
|
|
+
|
|
|
+begin
|
|
|
+ C:=TComponent.Create(Nil);
|
|
|
+ try
|
|
|
+ C.Name:='DemoComponent';
|
|
|
+ C.Tag:=23;
|
|
|
+ Writeln('Complete component, directly as string :');
|
|
|
+ Writeln(JS.ObjectToJSONString(C));
|
|
|
+ JS.Options:=[jsoUseFormatString];
|
|
|
+ Writeln('Complete component, directly as string (Options:=[jsoUseFormatString]):');
|
|
|
+ Writeln(JS.ObjectToJSONString(C));
|
|
|
+ JS.Options:=[];
|
|
|
+ Writeln('');
|
|
|
+ finally
|
|
|
+ FreeAndNil(C);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+Procedure DemoStrings;
|
|
|
+
|
|
|
+Var
|
|
|
+ S : TStrings;
|
|
|
+ O : TJSONData;
|
|
|
+ C : TComponent;
|
|
|
+
|
|
|
+begin
|
|
|
+ S:=TStringList.Create;
|
|
|
+ try
|
|
|
+ S.Add('One');
|
|
|
+ S.Add('two');
|
|
|
+ S.Add('Three');
|
|
|
+ O:=JS.StreamTStrings(S);
|
|
|
+ DumpObject('Default TStrings',O);
|
|
|
+ O:=JS.StreamTStringsArray(S);
|
|
|
+ DumpObject('TStrings as array',O);
|
|
|
+ C:=TComponent.Create(Nil);
|
|
|
+ try
|
|
|
+ C.Name:='SubComponent';
|
|
|
+ C.Tag:=12;
|
|
|
+ S.Objects[0]:=C;
|
|
|
+ O:=JS.StreamTStringsObject(S);
|
|
|
+ DumpObject('TStrings as object',O);
|
|
|
+ Writeln('TStrings Directly as JSON string, array');
|
|
|
+ Writeln(JS.StringsToJSON(S,False));
|
|
|
+ Writeln();
|
|
|
+ Writeln('TStrings Directly as JSON string, object');
|
|
|
+ Writeln(JS.StringsToJSON(S,True));
|
|
|
+ Writeln();
|
|
|
+ O:=JS.ObjectToJSON(S);
|
|
|
+ DumpObject('Passing TStrings to ObjctToJSON',O);
|
|
|
+ JS.Options:=[jsoTstringsAsArray];
|
|
|
+ O:=JS.ObjectToJSON(S);
|
|
|
+ DumpObject('Passing TStrings to ObjctToJSON (Options:=[jsoTstringsAsArray])',O);
|
|
|
+ JS.Options:=[jsoTstringsAsObject];
|
|
|
+ O:=JS.ObjectToJSON(S);
|
|
|
+ DumpObject('Passing TStrings to ObjctToJSON (Options:=[jsoTstringsAsObject])',O);
|
|
|
+ finally
|
|
|
+ FreeAndNil(C);
|
|
|
+ end;
|
|
|
+ finally
|
|
|
+ FreeAndNil(S);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+Procedure DemoCollection;
|
|
|
+
|
|
|
+Var
|
|
|
+ C : TCollection;
|
|
|
+ CC : TCollComponent;
|
|
|
+ O : TJSONData;
|
|
|
+
|
|
|
+begin
|
|
|
+ C:=TCollection.Create(TTestItem);
|
|
|
+ try
|
|
|
+ (C.Add as TTestItem).StrProp:='One';
|
|
|
+ (C.Add as TTestItem).StrProp:='Two';
|
|
|
+ (C.Add as TTestItem).StrProp:='Three';
|
|
|
+ CC:=TCollComponent.Create(Nil);
|
|
|
+ try
|
|
|
+ CC.CollProp:=C;
|
|
|
+ O:=JS.ObjectToJSON(CC);
|
|
|
+ DumpObject('Collection property',O);
|
|
|
+ O:=JS.StreamCollection(C);
|
|
|
+ DumpObject('StreamCollection result',O);
|
|
|
+ O:=JS.ObjectToJSON(C);
|
|
|
+ DumpObject('Passing collection to ObjectToJSON (returns an object)',O);
|
|
|
+ Writeln('Direct Collection to JSON String :');
|
|
|
+ Writeln(JS.CollectionToJSON(C));
|
|
|
+ Writeln;
|
|
|
+ finally
|
|
|
+ FreeAndNil(CC);
|
|
|
+ end;
|
|
|
+ finally
|
|
|
+ FreeAndNil(C);
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+Procedure DemoVariant;
|
|
|
+
|
|
|
+Var
|
|
|
+ V : Variant;
|
|
|
+ O : TJSONData;
|
|
|
+ I : integer;
|
|
|
+
|
|
|
+begin
|
|
|
+ V:=3;
|
|
|
+ O:=JS.StreamVariant(V);
|
|
|
+ DumpObject('Simple integer variant streaming',O);
|
|
|
+ V:=EncodeDate(2010,12,24);
|
|
|
+ O:=JS.StreamVariant(V);
|
|
|
+ DumpObject('Date variant streaming',O);
|
|
|
+ JS.Options:=[jsoDateTimeAsString];
|
|
|
+ O:=JS.StreamVariant(V);
|
|
|
+ DumpObject('Date variant streaming (Options:=[jsoDateTimeAsString];)',O);
|
|
|
+ V:=VarArrayCreate([1,10],varInteger);
|
|
|
+ For I:=1 to 10 do
|
|
|
+ V[i]:=11-I;
|
|
|
+ O:=JS.StreamVariant(V);
|
|
|
+ DumpObject('Variant arrays also work',O);
|
|
|
+ Writeln('Variant to JSON string :');
|
|
|
+ Writeln(JS.VariantToJSON(V));
|
|
|
+ Writeln('Variant to JSON string, with formatting :');
|
|
|
+ JS.Options:=[jsoUseFormatString];
|
|
|
+ Writeln(JS.VariantToJSON(V));
|
|
|
+ JS.Options:=[];
|
|
|
+end;
|
|
|
+
|
|
|
+begin
|
|
|
+ JS:=TJSONStreamer.Create(Nil);
|
|
|
+ try
|
|
|
+ DemoObject;
|
|
|
+ DemoObjectAsString;
|
|
|
+ DemoComponentObject;
|
|
|
+ DemoEnumObject;
|
|
|
+ DemoSetObject;
|
|
|
+ DemoStrings;
|
|
|
+ DemoCollection;
|
|
|
+ DemoVariant;
|
|
|
+ DemoChildObject;
|
|
|
+ Finally
|
|
|
+ FreeAndNil(JS);
|
|
|
+ end;
|
|
|
+end.
|