記事
Mihoko Iijima · 2021年3月9日 1m read

ダイナミックオブジェクトの JSON 変換で MAXSTRING エラーが出る場合の対処方法

これは InterSystems FAQ サイトの記事です。

ダイナミックオブジェクトから JSON 文字列を生成するときに使用する %ToJSON() の引数にストリームオブジェクトを指定することでエラーを回避できます。

コード例は以下の通りです。

USER>set temp=##class(%Stream.TmpCharacter).%New()

USER>set jsonobj={}

USER>set jsonobj.pro1=["a","b","c","d"]

USER>set jsonobj.pro2=["あ","い","う","え"]

USER>do jsonobj.%ToJSON(temp)

USER>write temp.Size
51
USER>write temp.Read()
{"pro1":["a","b","c","d"],"pro2":["あ","い","う","え"]}

 

詳細はドキュメントもご参照下さい。

【IRIS】大きいダイナミック・エンティティからストリームへのシリアル化

大きいダイナミック・エンティティからストリームへのシリアル化

10
1 0 3 29
Log in or sign up to continue

返信

こんにちは、mihokoさん

%Stream.TmpCharacterクラスを使用した場合、IRISTEMPデータベースにデータが書き込まれると理解してよろしいでしょうか?

また、作成したストリームデータは明示的に削除する必要はありますか?

こんにちは、Amanoさん

ご質問ありがとうございます!

確認してみたところ、ご質問いただいたように、IRISTEMP に書くには書くのですが、大きなサイズになったときにプロセスプライベートグローバル(=PPG。こちらも IRISTEMP に格納される変数)へセットしていました。

ちなみに、上に書いているサンプルだと、PPG は使用していませんでした。

削除についてですが、ストリームを格納した変数を消去すると使用していた PPG も消えますので、「ストリームをセットした変数を kill する」を入れるのが確実だと思います(メソッド終了でローカル変数も消えますが、明示的に書いた方がわかりやすいかな、と思いました)。

確認するまで私も知りませんでしたので、ご質問いただきありがとうございました!

mihokoさん

%Stream.TmpCharacterクラスは便利そうですね。

回答ありがとうございました。