大量データをJSON形式で渡す方法
これは InterSystems FAQ サイトの記事です。
ダイナミックオブジェクトの%ToJSONメソッドを利用することで簡単にJSONデータを送信することができます。
但し、標準的な方法では、出力するJSONのデータがIRIS文字列の最大長(約32万文字 正確には$SYSTEM.SYS.MaxLocalLength()が返す値)を超えると<MAXLENGTH>エラーとなります。
これを回避するためには、文字列として返すのではなく、%ToJSONメソッドの出力先としてStreamを指定し、その結果作成されたそのStreamデータを順次読み取って、出力先に書き出すようにする必要があります。
以下のように処理できます。
ClassMethod bigjson() As%Status [ ProcedureBlock = 0 ]
{
setx={}
for i=1:1:100 {
set cmd=" set x.a"_i_" = ^a ";; ^aのサイズは1MBxecute cmd
}
set tmpStream = ##class(%Stream.GlobalCharacter).%New()
dox.%ToJSON(tmpStream)
while tmpStream.AtEnd'=1 {
write tmpStream.Read(1000)
}
quit$$$OK
}
なお、このような処理はREST APIの実装として用いられることが多いと想定されますが、あまりの大量データを一度にREST経由で送信することは、ネットワーク帯域の逼迫や応答時間の増大等の影響が懸念されるため、その処理の適切性について十分考慮する必要があり、場合によっては、他の方法を検討した方が良いケースもあります。
ディスカッション (0)0