Difference between revisions of "fcl-json"
(Sample Usage) |
|||
Line 212: | Line 212: | ||
end; | end; | ||
end; | end; | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Sample Usage == | ||
+ | |||
+ | <syntaxhighlight> | ||
+ | |||
+ | procedure JSONTest; | ||
+ | var | ||
+ | jData : TJSONData; | ||
+ | jObject : TJSONObject; | ||
+ | s : string; | ||
+ | begin | ||
+ | |||
+ | // create from string | ||
+ | jData := GetJSON('{"Fld1" : "Hello", "Fld2" : 42, "Colors" : ["Red", "Green", "Blue"]}'); | ||
+ | |||
+ | // output as a flat string | ||
+ | s := jData.AsJSON; | ||
+ | |||
+ | // output as nicely formatted JSON | ||
+ | s := jData.FormatJSON; | ||
+ | |||
+ | // cast as TJSONObject to make access easier | ||
+ | jObject := TJSONObject(jData); | ||
+ | |||
+ | // retrieve value of Fld1 | ||
+ | s := jObject.Get('Fld1'); | ||
+ | |||
+ | // change value of Fld2 | ||
+ | jObject.Integers['Fld2'] := 123; | ||
+ | |||
+ | // retrieve the second color | ||
+ | s := jData.FindPath('Colors[1]').AsString; | ||
+ | |||
+ | end; | ||
+ | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 00:34, 16 December 2015
Info
fcl-json is JSON implementation.
Contains such units:
- fpjson: base unit which implements TJsonData and its children, e.g. TJsonObject
- jsonParser: implements TJsonParser used in example below
- jsonConf: implements TJsonConfig which is handy to read/write application data to files
- jsonScanner: json source lexical analyzer
Note: In fpjson, accessing e.g. SomeJSONObject.Integers['price'] may give a SIGSEGV/Access Violation if that integer variable does not exist. This is apparently intentional, see [1]. You'd have to use the Find method (available since FPC 2.6.2) to first check if the element ('price' in this example) exists.
Streaming
fcl-json contains the unit "fpjsonrtti" which is used to load objects (TObject instances) from or save them to JSON format.
See Streaming JSON for a short example.
Examples
Save/load dialog position/size
uses jsonConf;
procedure TfmMain.SaveOptionsPos;
var
c: TJSONConfig;
begin
c:= TJSONConfig.Create(nil);
try
c.Filename:= GetAppPath(cFileHistory);
c.SetValue('/dialog/max', WindowState=wsMaximized);
if WindowState<>wsMaximized then
begin
c.SetValue('/dialog/posx', Left);
c.SetValue('/dialog/posy', Top);
c.SetValue('/dialog/sizex', Width);
c.SetValue('/dialog/sizey', Height);
end;
finally
c.Free;
end;
end;
procedure TfmMain.LoadOptionsPos;
var
nLeft, nTop, nW, nH: integer;
c: TJSONConfig;
begin
c:= TJSONConfig.Create(nil);
try
c.Filename:= GetAppPath(cFileHistory);
nLeft:= c.GetValue('/dialog/posx', Left);
nTop:= c.GetValue('/dialog/posy', Top);
nW:= c.GetValue('/dialog/sizex', Width);
nH:= c.GetValue('/dialog/sizey', Height);
SetBounds(nLeft, nTop, nW, nH);
if c.GetValue('/dialog/max', false) then
WindowState:= wsMaximized;
finally
c.Free;
end;
end;
Save/load TStringList
//Example of path: '/list_find'
procedure SLoadStringsFromFile(cfg: TJsonConfig; const path: string; List: TStrings);
var
i: integer;
s: UnicodeString;
begin
List.Clear;
for i:= 0 to OptMaxHistoryItems-1 do
begin
s:= cfg.GetValue(path+'/'+inttostr(i), '');
if s='' then Break;
List.Add(Utf8Encode(s));
end;
end;
procedure SSaveStringsToFile(cfg: TJsonConfig; const path: string; List: TStrings);
var
i: integer;
s: string;
begin
for i:= 0 to OptMaxHistoryItems-1 do
begin
if i<List.Count then
s:= List[i]
else
s:= '';
cfg.SetDeleteValue(path+'/'+inttostr(i), Utf8Decode(s), '');
end;
end;
From JsonViewer
Example usage can be found in the Lazarus jsonviewer tool (located in lazarus/tools/jsonviewer). In particular, this part of the tool shows how to use json:
procedure TMainForm.OpenFile(Const AFileName : String);
Var
S : TFileStream;
P : TJSONParser;
D : TJSONData;
begin
S:=TFileStream.Create(AFileName,fmOpenRead);
try
P:=TJSONParser.Create(S);
try
P.Strict:=FStrict;
D:=P.Parse;
finally
P.Free;
end;
finally
S.Free;
end;
FFileName:=AFileName;
SetCaption;
FreeAndNil(FRoot);
FRoot:=D;
ShowJSONDocument;
end;
procedure TMainForm.ShowJSONDocument;
begin
With TVJSON.Items do
begin
BeginUpdate;
try
TVJSON.Items.Clear;
SHowJSONData(Nil,FRoot);
With TVJSON do
If (Items.Count>0) and Assigned(Items[0]) then
begin
Items[0].Expand(False);
Selected:=Items[0];
end;
finally
EndUpdate;
end;
end;
end;
procedure TMainForm.ShowJSONData(AParent : TTreeNode; Data : TJSONData);
Var
N,N2 : TTreeNode;
I : Integer;
D : TJSONData;
C : String;
S : TStringList;
begin
N:=Nil;
if Assigned(Data) then
begin
Case Data.JSONType of
jtArray,
jtObject:
begin
If (Data.JSONType=jtArray) then
C:=SArray
else
C:=SObject;
N:=TVJSON.Items.AddChild(AParent,Format(C,[Data.Count]));
S:=TstringList.Create;
try
For I:=0 to Data.Count-1 do
If Data.JSONtype=jtArray then
S.AddObject(IntToStr(I),Data.items[i])
else
S.AddObject(TJSONObject(Data).Names[i],Data.items[i]);
If FSortObjectMembers and (Data.JSONType=jtObject) then
S.Sort;
For I:=0 to S.Count-1 do
begin
N2:=TVJSON.Items.AddChild(N,S[i]);
D:=TJSONData(S.Objects[i]);
N2.ImageIndex:=ImageTypeMap[D.JSONType];
N2.SelectedIndex:=ImageTypeMap[D.JSONType];
ShowJSONData(N2,D);
end
finally
S.Free;
end;
end;
jtNull:
N:=TVJSON.Items.AddChild(AParent,SNull);
else
N:=TVJSON.Items.AddChild(AParent,Data.AsString);
end;
If Assigned(N) then
begin
N.ImageIndex:=ImageTypeMap[Data.JSONType];
N.SelectedIndex:=ImageTypeMap[Data.JSONType];
N.Data:=Data;
end;
end;
end;
Sample Usage
procedure JSONTest;
var
jData : TJSONData;
jObject : TJSONObject;
s : string;
begin
// create from string
jData := GetJSON('{"Fld1" : "Hello", "Fld2" : 42, "Colors" : ["Red", "Green", "Blue"]}');
// output as a flat string
s := jData.AsJSON;
// output as nicely formatted JSON
s := jData.FormatJSON;
// cast as TJSONObject to make access easier
jObject := TJSONObject(jData);
// retrieve value of Fld1
s := jObject.Get('Fld1');
// change value of Fld2
jObject.Integers['Fld2'] := 123;
// retrieve the second color
s := jData.FindPath('Colors[1]').AsString;
end;
FpcTwit
The fpctwit library makes use of JSON to send/receive data.
See also
An article covering use of XML and JSON in FreePascal: PDF