Lazarus(FreePascal)でJSONを扱う – Information Teaching Service 雄飛

Lazarus(FreePascal)でJSONを扱う

 おくれまして明けまして。

おめでとうございます。

 

もう、1月終わりです。

そんなこんな時期に明けまして投稿です。

 

さて!今回の話題は!

JSONです。

社会人学生時代、卒論で自作エディタからJSONを編集するエディタを作ったのですが。

それ以来です。

 

先ず。

サンプルがある割には、結構苦労する情報が多いLazarusのJSON。

 

色々、苦労しましたが、編集できるようになりました。

判ればこっちのもので、結構、使いやすくて便利です。

 

最下行にソースを置いておきます。

必要なのは、ボタン3つ、エディット2つ、メモ1つです。

 

Usesに以下のユニットを追加します。

fpjson

jsonConf

 

コンポーネント名は変更していません。

変数名は以下の通り。

   JsonData : TJSONData;

   JsonObj : TJSONObject;

   JsonArray : TJSONArray;

 

先ず、

JsonObj := TJSONObject.Create;

で、JSONをCreateします。

次に、

JsonObj.Add( 項目名,値 );

で、項目を足していきます。

 

Arrayを使う場合は、以下の感じ。

JsonArray := TJSONArray.Create;

JsonArray.Add( 値 );

JsonObj.Add( 項目名, JsonArray );

で、宣言し、値を追加し、格納します。

 

テキストに落として保存する時は、

  JsonData := JsonObj;

  String変数  :=  JsonData.FormatJSON;

 

検索する時は、

JsonData.FindPath( 項目名 ).AsString

例えば、

「Title」という項目名があった場合は、

項目名に’Title’と入れます。

Arrayの場合は、Title[番号]

例:Title[3]

になります。

 

変更したい場合は、

先ず、

GetJSON()したものを、TJSONObject()で変換を掛けます。

こんな感じ。

    JsonData := GetJSON( Memo1.Text );

    JsonObj  :=  TJSONObject( JsonData );

その次に、値を入れ替えます。

    JsonObj.Strings[ 項目名 ] :=  値;

あとは、以下の手順で普通にStringに格納し、保存するだけです。

JsonData  :=  JsonObj;

String変数 :=  JsonData.FormatJSON;

 

やっと、基本をつかめた感じではありますが、結構、便利です。

気軽にJSON扱えるとなると、これは便利ですね。

ありがたやありがたや。

 

参考にしたサイトは以下。

https://forum.lazarus.freepascal.org/index.php?topic=40272.0

https://wiki.freepascal.org/fcl-json

https://forum.lazarus.freepascal.org/index.php?topic=47298.0

http://lazplanet.blogspot.com/2014/09/a-simple-json-parsing-example.html

 

以下がソースになります。

それでは。

 

unit Unit1;{$mode objfpc}{$H+}

interface

uses

Classes, SysUtils, Forms, Controls, Graphics, Dialogs,

StdCtrls,fpjson,jsonConf;

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

Button3: TButton;

Edit1: TEdit;

Edit2: TEdit;

Memo1: TMemo;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

private

public

end;

var

Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);

var

JsonData : TJSONData;

JsonObj : TJSONObject;

JsonArray : TJSONArray;

begin

JsonObj := TJSONObject.Create;

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

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

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;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

JsonData: TJSONData;

begin

try

JsonData := GetJSON( Memo1.Text );

Showmessage( JsonData.FindPath( Edit1.Text ).AsString);

except

ShowMessage( ‘JSONのパスが違います。’ ) ;

end;

end;

procedure TForm1.Button3Click(Sender: TObject);

var

JsonData: TJSONData;

JsonObj : TJSONObject;

begin

try

JsonData := GetJSON( Memo1.Text );

JsonObj := TJSONObject( JsonData );

JsonObj.Strings[ Edit1.Text ] := Edit2.Text;

JsonData := JsonObj;

Showmessage( JsonData.FindPath( Edit1.Text ).AsString);

memo1.Lines.Text := JsonData.FormatJSON;

except

ShowMessage( ‘JSONのパスが違います。’ );

end;

end;

end.

 

コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です