はじめに
Blue Prism には、「連想配列(ハッシュ/辞書)」データ型は用意されていません。
JSON を扱うには、「配列」と「連想配列」が必要ですが、Blue Prism ではどのようにして対応することができるのか、調べてみました。
JSON をパースする
今回サンプルとして扱う JSON は下記です。GMail API の Users.messages: list のレスポンスbodyを使いました。
{
"messages":[
{
"id":"1702fb0a2b9041c2",
"threadId":"1702fb0a2b9041c2"
},
{
"id":"17014c9439dae1bc",
"threadId":"17014c9439dae1bc"
}
],
"resultSizeEstimate":2
}
Blue Prism をインストールするとついてくる、Utility - JSON
という VBO に関連のアクションがありそうですので、使ってみます。
図中の A
で、Utility - JSON::JSON to Collection
を使って、JSON文字列からコレクションの変換を図っています。
その結果得られたコレクションは下記のような構造になっています。
- JSON の第一階層のKey である、"messages", "resultSizeEstimate" が列として認識されています。
- "resultSizeEstimate" は JSON上で値が数字の
2
であったため、コレクション上の "resultSizeEstimate" 列のタイプも「数値」型で、行の値も2
になっています。 - 一方で "messages" は JSON上で値が配列(「キーが
id
,threadId
の連想配列」の配列)だったため、コレクション上の "messages" 列のタイプも「コレクション」型で、行の値は、2行
と省略表記されています。
ちなみに、「2行」と書かれたリンクっぽいところをクリックするとエラー画面が表示されます。
この「2行」と書かれた値の正体はなんでしょうか?
計算ステージで message列に入っていたデータを messages
コレクションに値を取り出してみます。
すると、下記のようなデータになっていることがわかります。
* 列名は JSON:Array
で、「コレクション」型
* 値は二行入っており、 計1行の1
と書かれている。(同じようにリンクっぽく書かれているが、クリックするとエラー画面が表示されます)
- コレクションは事前定義なく列を複数使えるので、「一行だけのコレクション」を「連想配列」として利用しているのですね。もし、Blue Prism に連想配列型のデータ構造があれば、ここは「コレクション」型ではなく「連想配列」型と表示されたと思います。
このデータについて「繰り返しステージ」を使って個別に行のデータを取り出してみます。下記はデータの取り出しを行っている計算ステージです。(フロー図の「B」)
※ 一風変わった列名なので戸惑いますが、 [messages.JSON:Array]
と指定すれば動きます。
取り出したデータの構造はこちらです。こちらについても、1行のみのコレクション型データを連想配列として使っている様子が伺えます。
JSON をパースする際のまとめ
-
Utility - JSON::JSON to Collection
を使うと、JSON文字列を Blue Prism 上で扱うことができるデータ構造に変換できる - JSON の連想配列は、Blue Prism 上では 1行のみのコレクション型データとして扱う
JSON を組み立てる
Blue Prism のデータアイテムやコレクションを使って、JSON を組み立ててみます。
パースの際に使った JSON と同じもの(GMail API の Users.messages: list のレスポンスbody)を作ってみます。
{
"messages":[
{
"id":"1702fb0a2b9041c2",
"threadId":"1702fb0a2b9041c2"
},
{
"id":"17014c9439dae1bc",
"threadId":"17014c9439dae1bc"
}
],
"resultSizeEstimate":2
}
まず目的の JSON と同じ内容のコレクションを作成し、Utility - JSON::Collection to JSON
(下図「C」)を使って JSON に変換する流れで作成できそうです。
最終的に JSON に変換するためのコレクションを Target
という名前で用意します。列名は下記の通りです。
1行だけのデータを現在地として用意し、それを連想配列とみなしてUtility - JSON::Collection to JSON
に渡す流れです。
次に、messages として二件のデータをコレクション message list
として用意します。
message list
を、Target
の messages列に設定します。(フロー図の「A」)
同じように、message list
の行数を数えたデータアイテム カウント
を、Target
の resultSizeEstimate列に設定します。
Target
の内容が、目的とする JSON と同じ内容に設定できたので、Utility - JSON::Collection to JSON
を呼びます。(フロー図の「C」)
得られた結果は下記になりました。
[
{
"messages":[
{
"id":"id0",
"threadId":"threadId0"
},
{
"id":"id1",
"threadId":"threadId1"
}
],
"resultSizeEstimate":"2"
}
]
一番外側が、配列になっていますね。。。
結果としては正しいですが、ほしい形のJSONは得られませんでした。
JSON を組み立てる際のまとめ
Blue Prism が連想配列のデータタイプを、1行のコレクションとして扱っているためか、本来JSONのオブジェクトとして表現したいデータが、配列に囲まれてしまうことがわかりました。
うまいやり方をご存知の方がいらっしゃったら、コメント等で教えていただけるとありがたいです!
追記
Blue Prism に機能追加要望を出せるとのことなので、 「Dictonary型のデータアイテムを追加して欲しい」 というリクエストを登録してみました。