【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:IRIS での JSON の操作
IRIS サーバ側で JSON の操作を行う方法を解説します(3つのビデオに分かれています)。
ビデオ② :ダイナミックエンティティで利用できるメソッドの練習
ビデオ③ :SQL関数と %JSON.Adapter の使い方
なお、このビデオには、以下の関連ビデオがあります。ぜひご参照ください。
ビデオ①
このビデオの目次は以下の通りです。
最初~ 復習ビデオ/関連ビデオについて など
2:05~ JSONとは?
3:26~ JSONオブジェクト:ダイナミックエンティティの作成
//%DynamicObjectを使用した例 set json=##class(%DynamicObject).%New() set json.Name="テスト太郎" set json.Address="東京都新宿区" write json.%ToJSON() // 出力結果は以下の通り {"Name":"テスト太郎","Address":"東京都新宿区"} //リテラルJSONコンストラクタ {} を使用した例 set json={} // %DynamicObjectと一緒 set json.Name="テスト太郎",json.Address="東京都新宿区" write json.%ToJSON() // 出力結果は以下の通り {"Name":"山田太郎","Address":"東京都新宿区"}
7:25~ JSON配列:ダイナミックエンティティでの作成例
//%DynamicArrayを使用した例 set array=##class(%DynamicArray).%New() set array."0"="配列1" // 配列はインデックス番号0からスタート set array."1"="配列2" write array.%ToJSON() // 出力結果は以下の通り ["配列1","配列2"] //リテラルJSONコンストラクタ [] を使用した例 set array=[] // %DynamicArrayと一緒 set array."0"="配列1",array."1"="配列2" write array.%ToJSON() // 出力結果は以下の通り ["配列1","配列2"]
9:49~ ダイナミックエンティティ操作用のメソッド
※ ビデオ②に続きます
ビデオ②
もくじは以下の通りです。
00:00~ %Set()、%Get()、%Remove() オブジェクト編
set obj={} set obj.Name="山田太郎" do obj.%Set("Zip","160-0023") do obj.%Set("Tel","03-5321-6200") write obj.%ToJSON() write obj.%Get("Zip")," - ",obj.%Get("Name") do obj.%Remove("Zip") write obj.%ToJSON() set obj.Pref="東京都" write obj.%ToJSON() do obj.%Set("City","新宿区") write obj.%ToJSON()
02:02~ %Set()、%Get()、%Remove() 配列編
set array=[] do array.%Set(0,"最初") write array.%ToJSON() set array."4"="最後" //set array."番号"="値" は array.%Set("番号","値")と同等 do array.%Set(2,"真中") write array.%ToJSON() do array.%Pop() write array.%ToJSON() do array.%Push("Pushしたデータ") write array.%ToJSON() do array.%Remove(1) // 左から2番目の null を削除 write array.%ToJSON()
03:34~ JSON配列 要素の操作:%Size()、%Get()
set array=["最初",null,""] do array.%Set(4,"最後") // インデックス番号3 はJSONのnullを設定 write array.%ToJSON() // 出力結果は以下の通り ["最初",null,"",null,"最後"] for i=0:1:array.%Size()-1 w array.%Get(i),! // 出力結果は以下の通り 最初 最後
05:20~ 値が有効値かどうか確認する %IsDefined()
set array=["最初",null,""] do array.%Set(4,"最後") // インデックス番号3 はJSONのnullを設定 write array.%ToJSON() // 出力結果は以下の通り ["最初",null,"",null,"最後"] for i=0:1:array.%Size()-1 {write array.%Get(i)," - 有効値?",array.%IsDefined(i),!} // 出力結果は以下の通り 最初 - 有効値?1 - 有効値?1 - 有効値?1 - 有効値?0 最後 - 有効値?1
07:38~ 反復処理:配列の場合:%GetIterator()
set array=["最初",null,""] do array.%Set(4,"最後") // インデックス番号3 はJSONのnullを設定 write array.%ToJSON() // 出力結果は以下の通り ["最初",null,"",null,"最後"] set iter=array.%GetIterator() while iter.%GetNext(.key,.val) { write key," - value= ",val,! } // 出力結果は以下の通り 0 - value= 最初 1 - value= 2 - value= 4 - value= 最後
09:55~ 反復処理:オブジェクトの場合:%GetIterator()
set obj={"Name":"山田太郎","Zip":"160-0023","Pref":"東京都","City":"新宿区"} write obj.%ToJSON() // 出力結果は以下の通り {"Name":"山田太郎","Zip":"160-0023","Pref":"東京都","City":"新宿区"} set iter=obj.%GetIterator() while iter.%GetNext(.key,.val) { write key," - value= ",val,! } // 出力結果は以下の通り Name - value= 山田太郎 Zip - value= 160-0023 Pref - value= 東京都 City - value= 新宿区
10:11~ JSON null/true/false (ObjectScriptの中での対応)
set array=[null,true,false,1,0,""] set array."7"="値あり" for i=0:1:array.%Size()-1 { write i," - ",array.%Get(i),! } // 出力結果は以下の通り 0 - 1 - 1 2 - 0 3 - 1 4 - 0 5 - 6 - 7 - 値あり
11:40~ JSONのデータタイプを確認する= %GetTypeOf()メソッド
set array=[null,true,false,1,0,""] set array."7"="値あり" for i=0:1:array.%Size()-1 {write i," - ",array.%Get(i)," - ",array.%GetTypeOf(i),! } // 出力結果は以下の通り 0 - - null 1 - 1 - boolean 2 - 0 - boolean 3 - 1 - number 4 - 0 - number 5 - - string 6 - - unassigned 7 - 値あり - string
12:32~ JSONのデータタイプを指定して値を設定する
set array=[] do array.%Set(0,"","null") // 第2引数はスクリプト上のnull do array.%Set(1,1,"number") //数字の1として設定 do array.%Set(2,0,"number") //数字の0として設定 do array.%Set(3,1,"boolean") // booleanの1=trueとして設定 do array.%Push(0,"boolean") // booleanの0=false として設定 for i=0:1:array.%Size()-1 { write i," - ",array.%Get(i)," - ",array.%GetTypeOf(i),! } // 出力結果は以下の通り 0 - - null 1 - 1 - number 2 - 0 - number 3 - 1 - boolean 4 - 0 - boolean write array.%ToJSON() // 出力結果は以下の通り [null,1,0,true,false]
13:38~ ObjectScriptの変数や表現式を [] や {} で使用する方法
set obj={"日付":($ZDATE($H,16)),"時刻":($ZTIME($PIECE($H,",",2)))} write obj.%ToJSON() set mgr=$system.Util.ManagerDirectory() set array=[($system.Util.InstallDirectory()),(mgr)] write array.%ToJSON()
※ ビデオ③へつづきます
ビデオ③
もくじは以下の通りです。
00:00~ テーブルデータをJSONオブジェクト、JSON配列で取得する方法 概要
関連ビデオのご紹介
(Test.Personの作り方を確認する場合に良いビデオ)
上記ビデオの 13:20~(スタジオでの操作)/18:44~(VS Code での操作) で作成方法を紹介しています。
00:54~ SQL:SELECTでの操作 JSON_OBJECT()関数 説明と実演
管理ポータル→システムエクスプローラ→SQL を開き対象ネームスペースに移動後
クエリ実行タブで以下実行します。
02:42~ JSON_OBJECT()例(埋込SQLでの実行例)
Class Test.JSONTest { ClassMethod GetAllPerson() { //埋込SQL &sql(declare C1 cursor for select JSON_OBJECT('Name':Name,'Email':Email) as json into :json from Test.Person) &sql(open C1) set array=[] for { &sql(fetch C1) if SQLCODE'=0 { quit } set obj={}.%FromJSON(json) do array.%Push(obj) } &sql(close C1) write array.%ToJSON() } }
//実行文 do ##class(Test.JSONTest).GetAllPerson()
07:00~ SQL:SELECTでの操作 JSON_ARRAY()関数
管理ポータル→システムエクスプローラ→SQL を開き対象のネームスペースに移動後
クエリ実行タブで以下実行します。
07:50~ JSON_ARRAY()例(ダイナミックSQL実行例)
ClassMethod GetAllPersonArray() { set sql="SELECT JSON_ARRAY(Name,Email ABSENT ON NULL) as array from Test.Person" set stmt=##class(%SQL.Statement).%New() set status=stmt.%Prepare(sql) set rset=stmt.%Execute() set root=[] while rset.%Next() { set array=[].%FromJSON(rset.%Get("array")) do root.%Push(array) } do root.%ToJSON() }
//実行文do ##class(Test.JSONTest).GetAllPersonArray()
08:59~ JSONアダプタ(%JSON.Adapter)
set person=##class(Test.Person).%OpenId(1) set status=person.%JSONExport() write status
10:08~ オブジェクト→JSON文字列を含むストリーム %JSONExportToStream() 説明と実演
set person=##class(Test.Person).%OpenId(1) set st=person.%JSONExportToStream(.jstream) write st write jstream.Read() write jstream.Rewind() set jobj={}.%FromJSON(jstream.Read()) write jobj.Name write jobj.Email
12:59~ オブジェクト→JSON文字列にマッピング %JSONExportToString()
set person=##class(Test.Person).%OpenId(1) set st=person.%JSONExportToString(.jstring) write st write jstring set jobj={}.%FromJSON(jstring) write jobj.Name write jobj.Email
13:20~ JSON文字列→オブジェクトへのマッピング %JSONImport()
set json.Name="ジェイソン", json.Email="json@mail.com" zwrite json set p1=##class(Test.Person).%New() set st=p1.%JSONImport(json) write st
14:24~ 確認できたこと