👾

Uipathで扱うJSONオブジェクト

2022/08/22に公開

kintoneから取得したデータをこねこねしたいというシーンがよくありますが、Jsonオブジェクトを扱う際のデータ型がよくわからなかったので調べました。
JavaScriptはデータ型をあまり気にしなくても操作できるので、Jsonオブジェクトの扱いはあまり難しくないですが、Uipathでやろうと思うとがっつりデータ型を指定しないといけないので難しい、よくわからないと感じています。

なにがわからないのか

例えば、kintoneからレコードを一括取得をした時ですが、レスポンスのrecordsはJson配列を取得することができます。
JavaScriptなら普通にforEachとかでループ処理しながら値の処理ができますが、Uipathで同様のことをしたい場合は、配列の処理になるので繰り返し(コレクションの各要素)を使うことが多いですが(今のところ例外なし)、そのプロパティにはアイテムのデータ型を入れないといけないので、最初はそこで何度もエラーを吐きました。
その時に初めてJsonを取り巻く(?)多数のデータ型の存在に気づきました。

調べてみた

どんな型があるかまず確認してみました。
JToken
JObject
JArray
JValue
JPropaty

見たことあるのはこんなところでしょうか。

JTokenが継承元のクラスで、その他はJTokenから派生しているそうです。

レスポンスのJsonをデシリアライズした時点でその変数はJObjectです。
これはJTokenにもできるのか疑問に思ったので試してみましたが、できませんでした。

出力してみると下記のようになります。

{
	"records":[
		{
		      "文字列": {
			"type": "SINGLE_LINE_TEXT",
			"value": "あいうえお"
		      },
		      "数値": {
			"type": "NUMBER",
			"value": "123456789"
		      }
		 },{
		     "文字列": {
			  "type": "SINGLE_LINE_TEXT",
			  "value": "かきくけこ"
		     },
		     "数値": {
			"type": "NUMBER",
			"value": "987654321"
		     }
		 }
	],
	"totalCount": "8000"
}

デバックして見てみるとすごいことになっていました。

JObject(2) { 
    JProperty(1) { 
        JArray(レコードの件数) { 
            JObject(フィールドの数) {
		    JProperty(1) { 
                    JObject(2) {
                        JProperty(1) {[SINGLE_LINE_TEXT] }, 
                        JProperty(1) {[あいうえお] }
                    }
                } },
            JObject(フィールドの数) {
		    JProperty(1) {
                    JObject(2) {
                        JProperty(1) { [NUMBER] },
                        JProperty(1) { [123456789] }
                    }
                }
	    }
        }
    },
    JProperty(1) {
         [2] 
    }
}

なんと複雑なんでしょう。。と思いましたが、調べているとわかってきました!!

紐解いてみる

まずオブジェクト全体はJObjectです。

その中の

"records":[・・・],
"totalCount": "8000"

※中のデータは省略

"records":[・・・]

"totalCount": "8000"

がそれぞれJPropertyです。

次にrecordsの中身の配列の部分ですが、

[
	{
	      "文字列": {
		"type": "SINGLE_LINE_TEXT",
		"value": "あいうえお"
	      },
	      "数値": {
		"type": "NUMBER",
		"value": "123456789"
	      }
	 },{
	     "文字列": {
		  "type": "SINGLE_LINE_TEXT",
		  "value": "かきくけこ"
	     },
	     "数値": {
		"type": "NUMBER",
		"value": "987654321"
	     }
	}
]

ここはわかりやすいですが、JArrayです。
この配列の中のデータ一つ一つがJObjectです。

{
      "文字列": {
	"type": "SINGLE_LINE_TEXT",
	"value": "あいうえお"
      }
 }

デバックしたところにはなかったですが、どうやら”あいうえお”等の部分がJValueになるようです。

所感

わかると意外とわかりやすいと思いました。
アクティビティ使用してループ処理するときは処理対象のデータがどれになっているかよく確認したらもう悩むことはなさそうです。

Discussion