LoginSignup
3
4

More than 3 years have passed since last update.

Blue Prism で JSON を扱う

Last updated at Posted at 2020-02-13

はじめに

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 に関連のアクションがありそうですので、使ってみます。

00.jpg

図中の A で、Utility - JSON::JSON to Collection を使って、JSON文字列からコレクションの変換を図っています。
その結果得られたコレクションは下記のような構造になっています。

01.jpg

  • JSON の第一階層のKey である、"messages", "resultSizeEstimate" が列として認識されています。
  • "resultSizeEstimate" は JSON上で値が数字の 2 であったため、コレクション上の "resultSizeEstimate" 列のタイプも「数値」型で、行の値も 2 になっています。
  • 一方で "messages" は JSON上で値が配列(「キーが id, threadId の連想配列」の配列)だったため、コレクション上の "messages" 列のタイプも「コレクション」型で、行の値は、2行 と省略表記されています。

ちなみに、「2行」と書かれたリンクっぽいところをクリックするとエラー画面が表示されます。

02.jpg

この「2行」と書かれた値の正体はなんでしょうか?

計算ステージで message列に入っていたデータを messages コレクションに値を取り出してみます。

03.jpg

すると、下記のようなデータになっていることがわかります。
* 列名は JSON:Array で、「コレクション」型
* 値は二行入っており、 計1行の1 と書かれている。(同じようにリンクっぽく書かれているが、クリックするとエラー画面が表示されます)

04.jpg

  • コレクションは事前定義なく列を複数使えるので、「一行だけのコレクション」を「連想配列」として利用しているのですね。もし、Blue Prism に連想配列型のデータ構造があれば、ここは「コレクション」型ではなく「連想配列」型と表示されたと思います。

このデータについて「繰り返しステージ」を使って個別に行のデータを取り出してみます。下記はデータの取り出しを行っている計算ステージです。(フロー図の「B」)
※ 一風変わった列名なので戸惑いますが、 [messages.JSON:Array] と指定すれば動きます。

05.jpg

取り出したデータの構造はこちらです。こちらについても、1行のみのコレクション型データを連想配列として使っている様子が伺えます。

06.jpg

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 に変換する流れで作成できそうです。

10.jpg

最終的に JSON に変換するためのコレクションを Target という名前で用意します。列名は下記の通りです。

11.jpg

1行だけのデータを現在地として用意し、それを連想配列とみなしてUtility - JSON::Collection to JSONに渡す流れです。

次に、messages として二件のデータをコレクション message list として用意します。

12.jpg

message list を、Target の messages列に設定します。(フロー図の「A」)

13.jpg

同じように、message listの行数を数えたデータアイテム カウント を、Target の resultSizeEstimate列に設定します。

14.jpg

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型のデータアイテムを追加して欲しい」 というリクエストを登録してみました。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4