Lazarus(FreePascal)でJSONを扱う2 – ITService雄飛

こんにちは、ITservice雄飛です。

 

今回も、JSONをLazarus(FreePascal) から扱った内容になります。

 

 

生成したJSONは前回に引き続き、以下になります。

 

{
 "Title" : "Sample",
 "Pages" : "4",
 "Parnt" : {
   "Child1" : "Data1",
   "Child2" : "Data2",
   "Child3" : {
   "Child4" : "Data3",
   "Child5" : "Data4"
  }
},
 "Catalog" : [
  "No1",
  "No2",
  "No3",
  "No4"
 ]
}

 

今回は、JSONの自動操作になります。

項目名取得や値の取得、操作を、半自動で行います。

 

ソースは最下行に張り付けてあります。

 

説明動画も作りましたので、以下を見ていただければと。

 

 

 

 

サンプルの画像は以下の感じ。

 

 

前回に引き続き。

項目の削除は、以下で出来ます。

JsonData := GetJSON( Memo1.Text );

JsonObj  :=  TJSONObject( JsonData );

JSONObj.Delete( 項目名 );

 

JsonObj.Names[番号]

で、項目名を取得できます。

 

上記に例えて、サンプルコードを書くと、

For  i  :=  0  to  JsonObj.Count -1 do begin

    JSONObj.Delete( JsonObj.Names[i] );

end;

上記のンプルだと、全ての項目を削除します。

 

以下の関数は、コンボボックスで指定した項目を表示します。

ストリングが対象ですが、アーレイでも基本は同じです。

  function getString(i:integer;obj:TJSONObject):boolean;
  var
    j:integer;
  begin
    for j := i to obj.Count -1 do begin
      if obj.Items[j].ClassName = 'TJSONString' then begin
        getString := true;
        if  combobox1.Text  =  obj.Names[j]  then  begin
            showmessage(obj.FindPath(obj.Names[j]).AsString);
            exit;
        end;
      end;
    end;
  end;          

オブジェクトの場合は以下の感じ。

   function getOBJ(i:integer;obj:TJSONObject):boolean;
  var
    JsonObj2 : TJSONObject;
    j:integer;
  begin
    if obj.Items[i].ClassName = 'TJSONObject' then begin
      getOBJ := true;
      JsonObj2  :=  TJSONObject( obj.Items[i] );
      for j := 0 to JsonObj2.Count -1 do begin
          if JsonObj2.Items[j].ClassName = 'TJSONObject' then begin
             getOBJ(j,JsonObj2);
          end;
          if JsonObj2.Items[j].ClassName = 'TJSONString' then begin
              if  combobox1.Text  =  JsonObj2.Names[j]  then  begin
                  showmessage(JsonObj2.FindPath(JsonObj2.Names[j]).AsString);
                  exit;
              end;
          end;
      end;
    end;
  end;    

 

アーレイの項目の変更/削除は苦しみました。

以下の感じ。

  function getARRAY(i:integer;obj:TJSONObject):boolean;
  var
    j:integer;
  begin
    if obj.Items[i].ClassName = 'TJSONArray' then begin
      getARRAY := true;
      for j := 0 to obj.Items[i].Count -1 do begin
          if  combobox1.Text  =  obj.Names[i]+'['+j.ToString+']'  then  begin
              showmessage(obj.FindPath(obj.Names[i]+'['+j.ToString+']').AsString);
              exit;
          end;
      end;
    end;
  end;


  function getOBJ(i:integer;obj:TJSONObject):boolean;
  var
    JsonObj2 : TJSONObject;
    j:integer;
  begin
    if obj.Items[i].ClassName = 'TJSONObject' then begin
      getOBJ := true;
      JsonObj2  :=  TJSONObject( obj.Items[i] );
      for j := 0 to JsonObj2.Count -1 do begin
          if JsonObj2.Items[j].ClassName = 'TJSONObject' then begin
             getOBJ(j,JsonObj2);
          end;
          if JsonObj2.Items[j].ClassName = 'TJSONString' then begin
              if  combobox1.Text  =  JsonObj2.Names[j]  then  begin
                  showmessage(JsonObj2.FindPath(JsonObj2.Names[j]).AsString);
                  exit;
              end;
          end;
      end;
    end;
  end;

こんな感じで、大体は操作出来ました。

結構、便利!

使わない手はないですな。

 

それでは!

 

以下ソースです、。

 unit Unit1;

 

{$mode objfpc}{$H+}

 

interface

 

uses

  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls,

  fpjson, jsonConf;

 

type

 

  { TForm1 }

 

  TForm1 = class(TForm)

    Button1: TButton;

    Button2: TButton;

    Button3: TButton;

    Button5: TButton;

    Button6: TButton;

    Button7: TButton;

    ComboBox1: TComboBox;

    Edit2: TEdit;

    Label1: TLabel;

    Memo1: TMemo;

    Panel1: TPanel;

    procedure Button1Click(Sender: TObject);

    procedure Button2Click(Sender: TObject);

    procedure Button3Click(Sender: TObject);

    procedure Button5Click(Sender: TObject);

    procedure Button6Click(Sender: TObject);

    procedure Button7Click(Sender: TObject);

  private

 

  public

 

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.lfm}

 

{ TForm1 }

 

procedure TForm1.Button1Click(Sender: TObject);

var

   JsonData : TJSONData;

   JsonObj, JsonObj2, JsonObj3 : TJSONObject;

   JsonArray : TJSONArray;

begin

  JsonObj := TJSONObject.Create;

  JsonObj.Add( ‘Title’,’Sample’ );

  JsonObj.Add( ‘Pages’,’4′ );

 

  JsonObj2 := TJSONObject.Create;

  JsonObj2.Add( ‘Child1′,’Data1’ );

  JsonObj2.Add( ‘Child2′,’Data2’ );

 

  JsonObj3 := TJSONObject.Create;

  JsonObj3.Add( ‘Child4′,’Data3’ );

  JsonObj3.Add( ‘Child5′,’Data4’ );

 

  JsonObj2.Add( ‘Child3’,JsonObj3 );

 

  JsonObj.Add( ‘Parnt’, JsonObj2 );

 

  JsonArray := TJSONArray.Create;

  JsonArray.Add( ‘No1’ );

  JsonArray.Add( ‘No2’ );

  JsonArray.Add( ‘No3’ );

  JsonArray.Add( ‘No4’ );

 

 

 

  JsonObj.Add( ‘Catalog’, JsonArray );

 

  JsonData := JsonObj;

  memo1.Lines.Text  :=  JsonData.FormatJSON;

  Button7Click(nil);

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var

  JsonData: TJSONData;

  JsonObj : TJSONObject;

  n : integer;

  function getARRAY(i:integer;obj:TJSONObject):boolean;

  var

    j:integer;

  begin

    if obj.Items[i].ClassName = ‘TJSONArray’ then begin

      getARRAY := true;

      for j := 0 to obj.Items[i].Count -1 do begin

          if  combobox1.Text  =  obj.Names[i]+'[‘+j.ToString+’]’  then  begin

              showmessage(obj.FindPath(obj.Names[i]+'[‘+j.ToString+’]’).AsString);

              exit;

          end;

      end;

    end;

  end;

  function getOBJ(i:integer;obj:TJSONObject):boolean;

  var

    JsonObj2 : TJSONObject;

    j:integer;

  begin

    if obj.Items[i].ClassName = ‘TJSONObject’ then begin

      getOBJ := true;

      JsonObj2  :=  TJSONObject( obj.Items[i] );

      for j := 0 to JsonObj2.Count -1 do begin

          if JsonObj2.Items[j].ClassName = ‘TJSONObject’ then begin

             getOBJ(j,JsonObj2);

          end;

          if JsonObj2.Items[j].ClassName = ‘TJSONString’ then begin

              if  combobox1.Text  =  JsonObj2.Names[j]  then  begin

                  showmessage(JsonObj2.FindPath(JsonObj2.Names[j]).AsString);

                  exit;

              end;

          end;

      end;

    end;

  end;

  function getString(i:integer;obj:TJSONObject):boolean;

  var

    j:integer;

  begin

    for j := i to obj.Count -1 do begin

      if obj.Items[j].ClassName = ‘TJSONString’ then begin

        getString := true;

        if  combobox1.Text  =  obj.Names[j]  then  begin

            showmessage(obj.FindPath(obj.Names[j]).AsString);

            exit;

        end;

      end;

    end;

  end;

 

begin

  JsonData := GetJSON( Memo1.Text );

  JsonObj  :=  TJSONObject( JsonData );

  for n := 0 to JsonObj.Count -1 do begin

    if getOBJ(n,JsonObj) then begin

 

    end;

    if getARRAY(n,JsonObj) then begin

 

    end;

    if getString(n,JsonObj) then begin

 

    end;

  end;

end;

 

procedure TForm1.Button3Click(Sender: TObject);

var

  JsonData: TJSONData;

  JsonObj : TJSONObject;

  n : integer;

  function getARRAY(i:integer;out obj:TJSONObject):boolean;

  var

    j:integer;

    s:string;

    JsonArray : TJSONArray;

  begin

    if obj.Items[i].ClassName = ‘TJSONArray’ then begin

      getARRAY := true;

      JsonArray := TJSONArray.Create;

      for j := 0 to obj.Items[i].Count -1 do begin

          if  combobox1.Text  =  obj.Names[i]+'[‘+j.ToString+’]’  then  begin

              JsonArray.Add( Edit2.Text );

          end else begin

              JsonArray.Add(obj.FindPath(obj.Names[i]+'[‘+j.ToString+’]’).AsString);

          end;

      end;

      s  :=  obj.Names[i];

      JsonObj.Delete( s );

      JsonObj.Add( s, JsonArray );

    end;

  end;

  function getOBJ(i:integer;out obj:TJSONObject):boolean;

  var

    JsonObj2 : TJSONObject;

    j:integer;

  begin

    if obj.Items[i].ClassName = ‘TJSONObject’ then begin

      getOBJ := true;

      JsonObj2  :=  TJSONObject( obj.Items[i] );

      for j := 0 to JsonObj2.Count -1 do begin

          if JsonObj2.Items[j].ClassName = ‘TJSONObject’ then begin

             getOBJ(j,JsonObj2);

          end;

          if JsonObj2.Items[j].ClassName = ‘TJSONString’ then begin

              if  combobox1.Text  =  JsonObj2.Names[j]  then  begin

                  JsonObj2.Strings[ Combobox1.Text ] :=  Edit2.Text;

                  exit;

              end;

          end;

      end;

    end;

  end;

  function getString(i:integer;out obj:TJSONObject):boolean;

  var

    j:integer;

  begin

    for j := i to obj.Count -1 do begin

      if obj.Items[j].ClassName = ‘TJSONString’ then begin

        getString := true;

        if  combobox1.Text  =  obj.Names[j]  then  begin

            obj.Strings[ Combobox1.Text ] :=  Edit2.Text;

            exit;

        end;

      end;

    end;

  end;

 

begin

  JsonData := GetJSON( Memo1.Text );

  JsonObj  :=  TJSONObject( JsonData );

  for n := 0 to JsonObj.Count -1 do begin

    if getOBJ(n,JsonObj) then begin

 

    end;

    if getARRAY(n,JsonObj) then begin

 

    end;

    if getString(n,JsonObj) then begin

 

    end;

  end;

  JsonData  :=  JsonObj;

  memo1.Lines.Text  :=  JsonData.FormatJSON;

end;

 

 

 

procedure TForm1.Button5Click(Sender: TObject);

var

  JsonData: TJSONData;

  JsonObj : TJSONObject;

  n : integer;

  function getARRAY(i:integer;out obj:TJSONObject):boolean;

  var

    j:integer;

    s:string;

    JsonArray : TJSONArray;

  begin

    if obj.Items[i].ClassName = ‘TJSONArray’ then begin

      getARRAY := true;

      JsonArray := TJSONArray.Create;

      for j := 0 to obj.Items[i].Count -1 do begin

          if  combobox1.Text  <>  obj.Names[i]+'[‘+j.ToString+’]’  then  begin

              JsonArray.Add(obj.FindPath(obj.Names[i]+'[‘+j.ToString+’]’).AsString);

          end;

      end;

      s  :=  obj.Names[i];

      JsonObj.Delete( s );

      JsonObj.Add( s, JsonArray );

    end;

  end;

 

  function getOBJ(i:integer;out obj:TJSONObject):boolean;

  var

    JsonObj2 : TJSONObject;

    j:integer;

  begin

    if obj.Items[i].ClassName = ‘TJSONObject’ then begin

      getOBJ := true;

      JsonObj2  :=  TJSONObject( obj.Items[i] );

      for j := 0 to JsonObj2.Count -1 do begin

          if JsonObj2.Items[j].ClassName = ‘TJSONObject’ then begin

             getOBJ(j,JsonObj2);

          end;

          if JsonObj2.Items[j].ClassName = ‘TJSONString’ then begin

              if  combobox1.Text  =  JsonObj2.Names[j]  then  begin

                  JsonObj2.Delete( Combobox1.Text );

                  exit;

              end;

          end;

      end;

    end;

  end;

  function getString(i:integer;out obj:TJSONObject):boolean;

  var

    j:integer;

  begin

    for j := i to obj.Count -1 do begin

      if obj.Items[j].ClassName = ‘TJSONString’ then begin

        getString := true;

        if  combobox1.Text  =  obj.Names[j]  then  begin

            Obj.Delete( Combobox1.Text );

            exit;

        end;

      end;

    end;

  end;

 

begin

  JsonData := GetJSON( Memo1.Text );

  JsonObj  :=  TJSONObject( JsonData );

  for n := 0 to JsonObj.Count -1 do begin

    if getOBJ(n,JsonObj) then begin

 

    end;

    if getARRAY(n,JsonObj) then begin

 

    end;

    if getString(n,JsonObj) then begin

 

    end;

  end;

  JsonData  :=  JsonObj;

  memo1.Lines.Text  :=  JsonData.FormatJSON;

end;

 

procedure TForm1.Button6Click(Sender: TObject);

var

  JsonData: TJSONData;

  JsonObj : TJSONObject;

  n : integer;

  function getARRAY(i:integer;obj:TJSONObject):boolean;

  var

    j:integer;

  begin

    if obj.Items[i].ClassName = ‘TJSONArray’ then begin

      getARRAY := true;

      for j := 0 to obj.Items[i].Count -1 do begin

          showmessage(obj.FindPath(obj.Names[i]+'[‘+j.ToString+’]’).AsString);

      end;

    end;

  end;

  function getOBJ(i:integer;obj:TJSONObject):boolean;

  var

    JsonObj2 : TJSONObject;

    j:integer;

  begin

    if obj.Items[i].ClassName = ‘TJSONObject’ then begin

      getOBJ := true;

      JsonObj2  :=  TJSONObject( obj.Items[i] );

      for j := 0 to JsonObj2.Count -1 do begin

          if JsonObj2.Items[j].ClassName = ‘TJSONObject’ then begin

             getOBJ(j,JsonObj2);

          end;

          if JsonObj2.Items[j].ClassName = ‘TJSONString’ then begin

              showmessage(JsonObj2.FindPath(JsonObj2.Names[j]).AsString);

          end;

      end;

    end;

  end;

  function getString(i:integer;obj:TJSONObject):boolean;

  begin

    if obj.Items[i].ClassName = ‘TJSONString’ then begin

      getString := true;

      showmessage(obj.FindPath(obj.Names[i]).AsString);

    end;

  end;

 

begin

  JsonData := GetJSON( Memo1.Text );

  JsonObj  :=  TJSONObject( JsonData );

  for n := 0 to JsonObj.Count -1 do begin

    if getOBJ(n,JsonObj) then begin

    end;

 

    if getARRAY(n,JsonObj) then begin

    end;

 

    if getString(n,JsonObj) then begin

 

    end;

  end;

end;

 

procedure TForm1.Button7Click(Sender: TObject);

var

  JsonData : TJSONData;

  JsonObj : TJSONObject;

  i : integer;

  st : TStringList;

  function getARRAY(i:integer;obj:TJSONObject;out s:TStringList):boolean;

  var

    j:integer;

  begin

    if obj.Items[i].ClassName = ‘TJSONArray’ then begin

      getARRAY := true;

      for j := 0 to obj.Items[i].Count -1 do begin

          s.Add(obj.Names[i]+'[‘+j.ToString+’]’);

      end;

    end;

  end;

  function getOBJ(i:integer;obj:TJSONObject;out s:TStringList):boolean;

  var

    JsonObj2 : TJSONObject;

    j:integer;

  begin

    if obj.Items[i].ClassName = ‘TJSONObject’ then begin

      getOBJ := true;

      JsonObj2  :=  TJSONObject( obj.Items[i] );

      for j := 0 to JsonObj2.Count -1 do begin

          if JsonObj2.Items[j].ClassName = ‘TJSONObject’ then begin

             getOBJ(j,JsonObj2,s);

          end;

          if JsonObj2.Items[j].ClassName = ‘TJSONString’ then begin

              s.Add(JsonObj2.Names[j]);

          end;

      end;

    end;

  end;

  function getString(i:integer;obj:TJSONObject;out s:TStringList):boolean;

  begin

    if obj.Items[i].ClassName = ‘TJSONString’ then begin

      getString := true;

      s.Add(obj.Names[i]);

    end;

  end;

 

begin

  JsonData := GetJSON( Memo1.Text );

  JsonObj  :=  TJSONObject( JsonData );

  st := TStringList.Create;

  st.Clear;

  for i := 0 to JsonObj.Count -1 do begin

    if getOBJ(i,JsonObj,st) then begin

 

    end;

 

    if getARRAY(i,JsonObj,st) then begin

    end;

 

    if getString(i,JsonObj,st) then begin

 

    end;

  end;

  ComboBox1.Items.Text  :=  st.Text;

  st.Clear;

end;

end.
 

コメントをどうぞ

メールアドレスが公開されることはありません。