Difference between revisions of "fcl-json/ru"

From Lazarus wiki
Jump to navigationJump to search
Line 36: Line 36:
 
   jArray : TJSONArray;
 
   jArray : TJSONArray;
 
   s : string;
 
   s : string;
BEGIN
+
BEGIN  
 
 
 
   // это лишь минимальный пример того, что можно сделать с помощью этого API
 
   // это лишь минимальный пример того, что можно сделать с помощью этого API
  
Line 49: Line 48:
 
   s := jData.FormatJSON;
 
   s := jData.FormatJSON;
  
   // cast as TJSONObject to make access easier
+
   // передан как TJSONObject для простого доступа
 
   jObject := TJSONObject(jData);
 
   jObject := TJSONObject(jData);
  
   // retrieve value of Fld1
+
   // передача значения ключа "поле1"
   s := jObject.Get('Fld1');
+
   s := jObject.Get('поле1');
  
   // change value of Fld2
+
   // передача значения ключа "поле2"
 
   jObject.Integers['Fld2'] := 123;
 
   jObject.Integers['Fld2'] := 123;
  
   // retrieve the second color
+
   // передача второго цвета
   s := jData.FindPath('Colors[1]').AsString;
+
   s := jData.FindPath('Цвет[1]').AsString;
  
 
   // add a new element
 
   // add a new element
 
   jObject.Add('Happy', True);
 
   jObject.Add('Happy', True);
  
   // add a new sub-array
+
   // передать новый подмассив
 
   jArray := TJSONArray.Create;
 
   jArray := TJSONArray.Create;
   jArray.Add('North');
+
   jArray.Add('Север');
   jArray.Add('South');
+
   jArray.Add('Юг');
   jArray.Add('East');
+
   jArray.Add('Восток');
   jArray.Add('West');
+
   jArray.Add('Запад');
   jObject.Add('Directions', jArray);
+
   jObject.Add('Направление', jArray);
  
 
END;
 
END;
 
 
</syntaxhighlight>
 
</syntaxhighlight>
  

Revision as of 13:15, 14 March 2016

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

Информация

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

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

  • fpjson: базовый юнит, который реализует TJsonData и их потомков, например TJsonObject
  • JsonParser: реализует TJsonParser, используется в примере ниже
  • jsonConf: реализует TJsonConfig, что удобно для чтения/записи данных файлов приложения
  • jsonScanner: лексический анализатор исходников json
Light bulb  Примечание: В fpjson, доступ, например, SomeJSONObject.Integers['цена'] может дать Нарушение SIGSEGV/Access, если это целая переменная не существует. Это, очевидно, сделано намеренно, см [[1]].

Вы должны были бы использовать метод Find (доступен в FPC 2.6.2), чтобы сначала проверить, существует ли элемент ('цена' в данном примере).

Маршаллинг

fcl-json содержит юнит "fpjsonrtti", который используется для загрузки из объектов или сохранения их в формате JSON(экземпляров TObject).

Смотрите Streaming JSON для короткого примера.

Примеры

Итак ,начнём

USES fpjson, jsonparser;

PROCEDURE JSONTest;
VAR
   jData : TJSONData;
   jObject : TJSONObject;
   jArray : TJSONArray;
   s : string;
BEGIN   
   // это лишь минимальный пример того, что можно сделать с помощью этого API

   // создать строки JSON
   jData := GetJSON('{"поле1" : "Привет", "поле2" : 42, "Цвет" : ["Красный", "Зелёный", "Голубой"]}');

   // вывести как плоскую строку
   s := jData.AsJSON;

   //  вывести замечательно-отформатированный JSON
   s := jData.FormatJSON;

   // передан как TJSONObject для простого доступа
   jObject := TJSONObject(jData);

   // передача значения ключа "поле1"
   s := jObject.Get('поле1');

   // передача значения ключа "поле2"
   jObject.Integers['Fld2'] := 123;

   // передача второго цвета
   s := jData.FindPath('Цвет[1]').AsString;

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

   // передать новый подмассив
   jArray := TJSONArray.Create;
   jArray.Add('Север');
   jArray.Add('Юг');
   jArray.Add('Восток');
   jArray.Add('Запад');
   jObject.Add('Направление', 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