投稿者

Training Sales Engineer at InterSystems Japan
記事 Mihoko Iijima · 8月 5, 2020 8m read

【はじめての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()-1w 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()

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 - 12 - 03 - 14 - 05 -
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引数はスクリプト上のnulldo 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 を開き対象ネームスペースに移動後
 クエリ実行タブで以下実行します。

SELECT JSON_OBJECT('Name':Name,'Email':Email) ABSENT ON NULL as json from Test.Person

02:42~ JSON_OBJECT()例(埋込SQLでの実行例)

Class Test.JSONTest
{
ClassMethod GetAllPerson()
{
	//埋込SQL
	&sql(declare C1 cursorforselect 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 を開き対象のネームスペースに移動後
 クエリ実行タブで以下実行します。

SELECT JSON_ARRAY(Name,Email ABSENT ON NULL) as array from Test.Person

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={}
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~ 確認できたこと


《2024/1/16追記》ビデオには含まれていませんが、バージョン2023.3以降でJSON配列に情報を追加できる add()メソッド、JSON配列同士の結合に便利な addAll()メソッドが追加されました。

USER>set a1=["a","b","c"]

USER>do a1.add("追加")

USER>zwrite a1
a1=["a","b","c","追加"]  ; <DYNAMIC ARRAY>
USER>

USER>set a2=[1,2,3]

USER>do a1.addAll(a2)

USER>zwrite a1
a1=["a","b","c","追加",1,2,3]  ; <DYNAMIC ARRAY>

先頭へ戻る

Comments

Mihoko Iijima · 1月 16

ビデオには含まれていませんが、JSON配列同士の結合ができるメソッドなどが追加されましたので、本文末尾に追記しています。ぜひご確認ください。

0