記事
· 2023年10月10日 15m read

複雑なJSONの生成に便利な「JSONテンプレートエンジン」の使い方ご紹介

開発者の皆さん、こんにちは。

この記事では、複雑なJSON形式の文書を「JSONテンプレートエンジン」を利用して生成させる方法をご紹介します。

「JSONテンプレートエンジン」については、6月のウェビナーで使用例をご紹介しましたが、JSON生成対象として医療情報交換標準規格であるFHIRリソースのJSON(例:Patientリソース)を例に解説しています。

このエンジンは、JSON形式の文書であればどのような種類のデータでもご利用いただけますので、一般的なJSON形式の文書を利用して使い方をご紹介します。

例に使用するJSONはこちら👉 https://api.openbd.jp/v1/get?isbn=978-4-7808-0204-7&pretty

このサンプルから以下の部分を抜き出して、ObjectScriptでJSON形式の文書を組み立てていく方法をご紹介します。

{
    "onix": {
      "RecordReference": "9784780802047",
      "NotificationType": "03",
      "ProductIdentifier": {
        "ProductIDType": "15",
        "IDValue": "9784780802047"
      },
      "DescriptiveDetail": {
        "ProductComposition": "00",
        "ProductForm": "BA",
        "ProductFormDetail": "B108",
        "TitleDetail": {
          "TitleType": "01",
          "TitleElement": {
            "TitleElementLevel": "01",
            "TitleText": {
              "collationkey": "オニギリレシピイチマルイチ",
              "content": "おにぎりレシピ101"
            },
            "Subtitle": {
              "collationkey": "エヴリディオニギリイチマルイチヘルシーイージージャパニーズライスボールレシピズ",
              "content": "EVERYDAY ONIGIRI 101 Healthy, Easy Japanese Riceball Recipes"
            }
          }
        },
        "Contributor": [
          {
            "SequenceNumber": "1",
            "ContributorRole": [
              "A01"
            ],
            "PersonName": {
              "collationkey": "ヤマダ レイコ",
              "content": "山田 玲子"
            },
            "BiographicalNote": "クッキングアドバイザー。\n東京・浜田山の自宅にて料理教室「Salon de R」を主宰。「マダムなおうちごはん」から「おもてなしのコーディネイト」を楽しく大胆に調理する方法を伝授し、笑いあふれる料理教室として人気沸騰中。\n国内での出張料理教室のみならず、食は一番身近な外交と、NYやヒューストン、シンガポール、韓国など海外でも定期的に料理教室を開催。facebookで「おにぎり外交倶楽部」を立ち上げ、おにぎりの輪を世界に広げている。\n\nReiko Yamada (Cooking adviser)\nReiko hosts “Salon de R,” a cooking workshop at her private home in Tokyo. Her 30 years of experience as a food coordinator at a children’s international summer camp inspired the idea of food as the most basic form of diplomacy. She now hosts workshops throughout Japan and internationally in Singapore, Korea, New York City, and Houston. In addition, Reiko develops recipes for companies, and contributes to magazines and radio. Most recently, she launched a Facebook page called “Onigiri Diplomacy Club” to spread the onigiri circle around the world."
          },
          {
            "SequenceNumber": "2",
            "ContributorRole": [
              "A01"
            ],
            "PersonName": {
              "collationkey": "ミズノ ナオ",
              "content": "水野 菜生"
            }
          }
        ]
    }
}

 

本題に入る前に・・・

ObjectScriptではJavaScriptの構文と同様にJSONの操作が行えます。(この記事でご紹介するJSONテンプレートエンジンを使用しなくても上記文書の生成は行えます。)

例えば以下のイメージです。

💡ObjectScriptでのJSON操作について詳しくは、解説ビデオとサンプルコードが含まれている「【はじめてのInterSystems IRIS】セルフラーニングビデオ:アクセス編:IRIS での JSON の操作」をご参照ください。)

set onix={}
set onix.RecordReference="9784780802047"
set onix.NotificationType="03"
set onix.ProductIdentifier={}
set onix.ProductIdentifier.ProductIDType="15"
set onix.ProductIdentifier.IDValue="9784780802047"
set con(0)={}  //Contributor用オブジェクト
set con(0).SequenceNumber="1"
set con(0).ContributorRole=["A01","A02"]
set con(0).PersonName={"collationkey":"ヤマダ レイコ","content": "山田 玲子"}
set con(0).BiographicalNote="クッキングアドバイザー。\n東京..."
set onix.Contributor=[] //Contributor配列の用意
do onix.Contributor.%Set(0,con(0))  //配列に作成したContributorオブジェクトを追加
set onix.summary={"isbn":"9784780802047","title": "おにぎりレシピ101"}

set data=[]

do data.%Set(0,onix)
set f=##class(%JSON.Formatter).%New()  //JSONを見やすいフォーマットに変更するためのインスタンス生成
do f.Format(data.%ToJSON())  //JSON表示

このままコーディングしていくこともできますが、Contributor配列にはContributorオブジェクトが複数登場したり、上記例に抜粋した文書以外にも、同様に複数のJSONオブジェクトが含まれるJSON配列が多数登場します。(​​​TextContent、SupportingResource、ImprintIdentifier、PublisherIdentifier、PublishingDate、jyuhan、author、reviews)

また、一部データが固定値の場合、その都度JSONオブジェクトや配列に固定値を記述するのは面倒ですし、すべて手動でコーディングするためにはJSON全体の構造を把握しておく必要があります。

💡そこで💡

JSONテンプレートエンジンを利用して、手間のかかりそうな操作を簡略化する手順をご紹介します。

基本の使い方については、ウェビナーアーカイブビデオ👇の 19:44 ぐらいまで、ご覧ください。

https://www.youtube.com/embed/H4LzOV-Tfzg?list=PLzSN_5VbNaxB39_H2QMMEG_EsNEFc0ASz
[これは埋め込みリンクですが、あなたはサイト上の埋め込みコンテンツへのアクセスに必要な Cookie を拒否しているため、それを直接表示することはできません。埋め込みコンテンツを表示するには、Cookie 設定ですべての Cookie を受け入れる必要があります。]

 

手順は以下の通りです。

1) 生成したいJSONのテンプレートとなる文書をJSON形式で用意する

2) JSONテンプレートエンジン用クラスをIRISにインポートする

3) 2)でインポートしたJSONTemplate.Baseをスーパークラスに持つクラスを新規で作成する

4) 3)のクラスで、XDataブロックのTemplateをオーバーライドし、1)で用意してテンプレートを貼り付ける

5) 3)のクラスに、動的に変わる値を操作するためのプロパティを定義し、テンプレートに割り当てる

6) JSONの生成

 

では早速、作成してみましょう!

1) 生成したいJSONのテンプレートとなる文書をJSON形式で用意する

https://api.openbd.jp/v1/get?isbn=978-4-7808-0204-7&pretty の例文の一部分を利用します。詳細は上述のJSONをご覧ください。

 

2) JSONテンプレートエンジン用クラスをIRISにインポートする

JSONテンプレートエンジンはこちら👉 https://github.com/Intersystems-jp/JSONTemplate

上記リポジトリに含まれる、以下2つのクラスをIRISにインポートしてください。

https://github.com/Intersystems-jp/JSONTemplate/tree/main/src/JSONTemplate 以下にあるJSONTemplate.Baseクラス とJSONTemplate.Generatorクラス

※スタジオや管理ポータルから *.clsのクラス定義ファイルをインポートできます。

 

3) 2)でインポートしたJSONTemplate.Baseをスーパークラスに持つクラスを新規で作成する

定義文は以下の通り。

Class TestEngine.SampleJSON Extends JSONTemplate.Base

 

4) 3)のクラスで、XDataブロックのTemplateをオーバーライドし、1)で用意してテンプレートを貼り付ける

VSCode/スタジオのオーバーライドメニューを利用して、XData ブロックのTeamplte()をオーバーライドします。

まずは、1)で考えたテンプレートのJSONを{}内に転記します。

 
Template()の中身:加工前

この後、Template()に記載したJSONの中で動的に値を変更させたい部分を決定し、プロパティ値を割り当てられるように専用のプレースホルダー(#()#)を利用してプロパティ値をJSON内に当てはめるように記述を変更します。

 

5) 3)のクラスに、動的に変わる値を操作するためのプロパティを定義し、テンプレートに割り当てる

例えば、水色、緑、ピンク、青で囲われた部分が動的に変更するデータだとします。

 

上記カラーで囲った要素に動的に値を当てはめられるように、以下左図のプロパティを定義します。

また、XDataブロックのTemplate()のデータする要素に専用のプレースホルダー #()# を利用してプロパティ名を指定します(以下右図)。例: #(..プロパティ名)# 

 

次に、Contributorの情報に👇注目👇します。

ContributorはJSON配列で、複数のJSONオブジェクトが含まれるため、下の右図のように配列に含まれるJSONオブジェクトだけを表現するテンプレートクラス(例:TestEngine.DataType.Contributor)を用意する方法も検討できます(このクラスもJSONTemplate.Baseクラスを継承しています)。

Contributor配列を表現するテンプレートクラスが作成できたら、TestEngine.SampleJSONクラスのXDataブロックを以下のように加工します。

(Contributorに複数のオブジェクトが登録できるように、コレクションのリストとして定義します)

以上でテンプレートクラスの作成は終了です。

 
TestEngine.SampleJSONクラスの例
 
TestEngine.DataType.Contributorクラスの例

最後に、作成したテンプレートクラスを利用してJSONを生成してみましょう!​​​

 

6) JSONの生成

テンプレートクラスのインスタンスを生成し、定義したプロパティに値を割り当てます。

値が割り当て終わったら OutputToDevice()メソッドを使用してJSONの出力テストを行います(サンプルデータは https://api.openbd.jp/v1/get?isbn=978-4-7808-0204-7&pretty のデータを利用しています)。

set obj=##class(TestEngine.SampleJSON).%New()
set obj.TitleTextKey="オニギリレシピイチマルイチ"
set obj.TitleTextContent="おにぎりレシピ101"
set obj.SubtitleKey="エヴリディオニギリイチマルイチヘルシーイージージャパニーズライスボールレシピズ"
set obj.SubtitleContent="EVERYDAY ONIGIRI 101 Healthy, Easy Japanese Riceball Recipes"
//Contributor作成
set con=##class(TestEngine.DataType.Contributor).%New()
set con.SequenceNumber=1
set con.PersonNameKey="ヤマダ レイコ"
set con.PersonNameContent="山田 玲子"
do con.ContributorRole.Insert("A01")
do con.ContributorRole.Insert("A02")
set con.BiographicalNote="クッキングアドバイザー。\n東京・浜田山の自宅にて料理教室「Salon de R」を主宰。「マダムなおうちごはん」から「おもてなしのコーディネイト」を楽しく大胆に調理する方法を伝授し、笑いあふれる料理教室として人気沸騰中。\n国内での出張料理教室のみならず、食は一番身近な外交と、NYやヒューストン、シンガポール、韓国など海外でも定期的に料理教室を開催。facebookで「おにぎり外交倶楽部」を立ち上げ、おにぎりの輪を世界に広げている。\n\nReiko Yamada (Cooking adviser)\nReiko hosts “Salon de R,” a cooking workshop at her private home in Tokyo. Her 30 years of experience as a food coordinator at a children’s international summer camp inspired the idea of food as the most basic form of diplomacy. She now hosts workshops throughout Japan and internationally in Singapore, Korea, New York City, and Houston. In addition, Reiko develops recipes for companies, and contributes to magazines and radio. Most recently, she launched a Facebook page called “Onigiri Diplomacy Club” to spread the onigiri circle around the world."
//1件目のContributorをInsert()メソッドで割り当てる
do obj.Contributor.Insert(con)

set con=##class(TestEngine.DataType.Contributor).%New()
set con.SequenceNumber=2
set con.PersonNameKey="ミズノ ナオ"
set con.PersonNameContent="水野 菜生"
do con.ContributorRole.Insert("A01")
//2件目のContributorをInsert()メソッドで割り当てる
do obj.Contributor.Insert(con)

do obj.OutputToDevice()

 

テンプレートクラスのインスタンスからJSONを生成するメソッドですが、カレントデバイスにJSON文字列を出力するメソッドの他に、ストリームに出力するメソッドもあります。

set stream=##class(%Stream.TmpBinary).%New()
write obj.OutputToStream(stream)  //成功すると1が戻ります。
//ストリームにJSON文字列が出力されたか確認
write stream.Read()

 

また、IRISのダイナミックオブジェクトに変換する方法もあります(引数に参照渡しでJSONのダイナミックオブジェクトを設定する引数を指定します)。

write obj.OutputToDynamicObject(.jobj)
do jobj.%ToJSON()  //生成したダイナミックオブジェクトからJSON文字列をカレントデバイスに出力

 

ファイルに出力する方法もあります(引数に出力するファイルをフルパスで指定します)。

write obj.OutputToFile("c:\temp\test.json")  //処理が成功すると1を返します。

 

※JSON出力メソッドについて詳しくは、アーカイブビデオの22:10~をご参照ください。

JSONの生成については、ObjectScriptでダイナミックオブジェクトを利用しながら作成していく方法でも、JSONテンプレートエンジンを利用する方法でもどちらでも作成できます。

お好みの方法をご利用ください😀

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください