Difference between revisions of "fcl-json/ru"

From Free Pascal wiki
Jump to navigationJump to search
Line 11: Line 11:
 
* jsonScanner: лексический анализатор исходников json
 
* jsonScanner: лексический анализатор исходников json
  
{{Note|: В fpjson, доступ, например, SomeJSONObject.Integers [ 'цена'] может дать Нарушение SIGSEGV/Access, если это целая переменная не существует. Это, очевидно, сделано намеренно, см [http://bugs.freepascal.org/view.php?id=22273].}}
+
{{Note| В fpjson, доступ, например, SomeJSONObject.Integers [ 'цена'] может дать Нарушение SIGSEGV/Access, если это целая переменная не существует. Это, очевидно, сделано намеренно, см [http://bugs.freepascal.org/view.php?id=22273].}}
 
   
 
   
 
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.
 
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.

Revision as of 12:41, 14 March 2016

English (en) polski (pl) русский (ru) 中文(中国大陆)‎ (zh_CN)

Информация

fcl-json реализация стандарта JSON.

Пакет содержит юниты:

  • fpjson: базовый юнит, который реализует TJsonData и их потомков, например TJsonObject
  • JsonParser: реализует TJsonParser, используется в примере ниже
  • jsonConf: реализует TJsonConfig, что удобно для чтения/записи данных файлов приложения
  • jsonScanner: лексический анализатор исходников json
Light bulb  Примечание: {{{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

Getting Started

uses fpjson, jsonparser;

procedure JSONTest;
var
   jData : TJSONData;
   jObject : TJSONObject;
   jArray : TJSONArray;
   s : string;
begin
   
   // this is only a minimal sampling of what can be done with this API

   // 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;

   // add a new element
   jObject.Add('Happy', True);

   // add a new sub-array
   jArray := TJSONArray.Create;
   jArray.Add('North');
   jArray.Add('South');
   jArray.Add('East');
   jArray.Add('West');
   jObject.Add('Directions', jArray);

end;

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;

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

Package List