こんにちは、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.