UiPathでJSON文字列を自在に生成する

# はじめに
UiPathを使用してAPI連携メインのロボットを作成する際、APIコールに必要な複雑なJSONを作成する方法に悩んだため、備忘用に投稿しました。
本記事はあくまでも数ある方法の中での一つでしかなく、これが正解だと言いたいわけではないことをまず申し上げておきます。

なお本記事は、@masatomix 様の下記投稿を先にご覧になったほうが理解しやすいと思います。（非常にわかりやすい記事で参考にさせていただきました）

https://qiita.com/masatomix/items/da8efe3691758ebcafe0

本記事は上記の続編という扱いで見ていただければ幸いです。

# まずは結論から
とりあえず下記をおさえておけばOKです！次項から詳しく記載します。

- JSONの **{変数名, 値}** は、Dictionary の **{TKey, TValue}** で表現
- JSONの **値** を配列にしたいときは、**List<T>** で表現
- Dictonary型変数 → JSON文字列への変換は
`Newtonsoft.Json.JsonConvert.SerializeObject( Dictionary型変数 )`

※Newtonsoft.Json.JsonConvert.SerializeObject については[ココを参照](https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonConvert_SerializeObject.htm)

# 本記事のゴール
本記事を理解すれば、以下のようなJSONを難なく作れるようになれます！（のはず…）

```json:これを作れるようになろう
{
	"families": [
		{
			"name": "Bob",
			"age": 24,
			"favorite_color": [
				"blue",
				"green"
			],
			"active": true
		},
		{
			"name": "Lisa",
			"age": null,
			"favorite_color": [
				"red",
				"purple"
			],
			"active": false
		}
	]
}
```

では早速いってみましょう！

# 前提（開発環境とか）
#### UiPath
- Studio Pro 2021.4.0-beta.158（Community License）

#### 使用パッケージ
| Package                       | Version | 手動追加 |
|:------------------------------|:-------:|:-------:|
|UiPath.System.Activities       | 20.10.4 |         |
|Microsoft.Activities.Extensions| 2.0.6.9 | ※      |
|UiPath.WebAPI.Activities       | 1.6.0   | ※      |

※パッケージの手動追加が必要

# まずは基本のJSON作成（JSON値が文字列編）

本項は @masatomix 様の [投稿](https://qiita.com/masatomix/items/da8efe3691758ebcafe0) と内容が重複しますが、基本となるため本記事でも取り上げます。
まずは以下JSONの作成方法を記載します。

```json:作りたいJSON
{
	"name": "Bob",
	"email": "bob@example.com"
}
```

このようなシンプルな JSON であれば String 変数をゴリゴリいじって作成してもいいのですが、複雑な JSON になればなるほど実装内容がわかりづらくなる傾向があります。
そこで JSON は、以下のイメージで <font color="Red">Dictionary を作成 → 文字列に変換</font>、という実装をするとわかりやすくなります。

- 作成する Dictionary

| Key(String) | Value(String)     |
|:-----------:|:-----------------:|
| "name"      | "Bob"             |
| "email"     | "bob@example.com" |

では Studio で実装してみます。

### Studio作成例

**変数設定**
![Studio_変数設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/ce05de9c-206f-4f30-8701-04f215f98422.png)

**ワークフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/a348c97b-8c57-dff4-a730-7a231343cc65.png)

**解説**

```vb
Dim jsonDic = New Dictionary(Of String, String)
```

上記変数を Studio 上で定義および初期化しているので、**Add to dictionary** アクティビティで要素を2つ追加します。

- 1つ目の要素：Key="name", Value="Bob"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/d94e410e-7cba-5bbc-af61-ade99cbfd2ca.png)

- 2つ目の要素：Key="email", Value="bob@example.com"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/9bf30fa1-6ac9-3767-5e7c-b81a4a75df74.png)

これで Dictionary に要素を2つ追加することが出来ました。

***
※補足※
**Add to dictionary** アクティビティは Microsoft.Activities.Extensions パッケージをインストールしないと使えません。
「大人の事情でデフォルトのパッケージしか使えない:sob:」という方は、**代入** アクティビティや、 **Invoke Method** アクティビティで [Dictionary<TKey,TValue>.Add](https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic.dictionary-2.add) メソッドを使うと良いでしょう。

個人的に Dictionary に要素を追加する際は、閲覧性の良さから **Add to dictionary** アクティビティを好んで使っています。
***

その後、**JSON をデシリアライズ** アクティビティを実行します。
![Jsonをデシリアライズ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/a4a1ac7f-a30a-d306-a8a5-eb12f7cd2fc7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/4877d029-4372-9d74-de3c-f2d497551522.png)

このアクティビティは、JSON文字列を入力すると、それに対応するJsonオブジェクト(JObject型)の変数を返してくれます。

Json文字列 プロパティは、以下のように設定して下さい。
`Newtonsoft.Json.JsonConvert.SerializeObject(jsonDic)`

（[上記メソッド](https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonConvert_SerializeObject.htm)は、引数に指定した Dictionary を JSON 文字列化して返してくれます。ただし出力されるのは整形されていない JSON 文字列です。ログで見てわかりやすくするため、今回は JSON 整形の目的のみで **JSON をデシリアライズ** アクティビティを実行しています）

本アクティビティの出力結果は JObject 型で返ってきます。（JObject の詳細は[ココを参照](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JObject.htm)）
出力結果は `jsonObj` 変数に入っているので、この内容を `ToString` で見てみます。
結果はいかに...？

![メッセージをログ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/11d97ea2-b5d7-cd93-dbe0-e305e7a867a2.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/fd743302-515c-f783-1abf-ea9e8c590cda.png)

想定どおりのJSON文字列を作成することができました:clap:
Dictionary を使用することで、

- Key → JSONの変数名
- Value → JSONの値

という変換が簡単にできる、というのが基本となる重要なポイントです:point_up:

# JSON値が数値の場合
では欲しいJSON値が数値の場合、どうしたらいいでしょうか？

```json:作りたいJSON
{
	"age": 24
}
```

JSON値が数値の場合でも基本は同じで、**Dictionary を作成 → 文字列に変換** という流れは変わりません。
先ほどの例との変更箇所は、`Dictionary<TKey, TValue>` の `TValue` の型が <font color="Red">String → Int32 に変わるのみ</font> です。

| Key(String) | Value(<font color="Red">Int32</font>) |
|:-----------:|:-------------------------------------:|
| "age"       | 24                                    |

では Studio で実装してみます。

### Studio作成例

**変数設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/a178592c-3db3-c54f-3294-eb2d17810001.png)

**ワークフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/08d86fd8-0fc2-dee1-b20e-44d551759f28.png)

**解説**

```vb
Dim jsonDic = New Dictionary(Of String, Int32)
```

上記変数をStudio上で定義および初期化しているので、**Add to dictionary** アクティビティで要素を1つ追加します。

- 1つめの要素：Key="age", Value=24
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/0dfb470f-c1a5-8459-709b-6869fa8b7a2b.png)

上記 Dictionary を、JSON文字列に自動変換:point_down:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/0c14beee-9651-9aa0-324d-b22a0b614468.png)

想定通りのJSONが作成できました！
Dictionary の TValue の型を <font color="Red">Int32</font> で定義したので、それに合わせて出力される文字列が **24** となりダブルコーテーションで括られず、**JSON仕様的に正しい数値型として出力されている** のがポイントです:point_up:

# JSON値が真偽値の場合
欲しいJSON値が真偽値の場合でも、対応方法はまったく同じです。

```json:作りたいJSON
{
	"active": true
}
```

今回も同様に、欲しいJSON値の型に合わせて `Dictionary<TKey, TValue>` の `TValue` の型を <font color="Red">Boolean に変えるのみ</font> です。

| Key(String) | Value(<font color="Red">Boolean</font>) |
|:-----------:|:---------------------------------------:|
| "active"    | true                                    |

ではStudioで実装してみます。

### Studio作成例

**変数設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/7ff1ae33-a47c-2fb2-caf1-64afb7d51455.png)

**ワークフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/1d938939-47b1-c7de-b138-1d7512a38335.png)

**解説**

```vb
Dim jsonDic = New Dictionary(Of String, Boolean)
```

上記変数をStudio上で定義および初期化しているので、**Add to dictionary** アクティビティで要素を1つ追加します。

- 1つめの要素：Key="active", Value=True
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/46169041-fd86-19ef-0b94-c8894937b9ea.png)

上記 Dictionary を、JSON文字列に自動変換:point_down:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/dd9d7b6c-7562-80ad-5842-e489ded7f776.png)

こちらも想定通りですね！
Dictionary の `TValue` の型を <font color="Red">Boolean</font> で定義したので、それに合わせて出力される文字列が **true** となりダブルコーテーションで括られず、**JSON仕様的に正しい真偽値として出力されている** のがポイントです:point_up:

# JSON値に複数の型が必要な場合
ここからが実践編です。
以下のように、APIのパラメータに複数のJSON値の型を指定しなければならないケースがあります。

```json:作りたいJSON
{
	"name": "Bob",
	"age": 24,
	"active": true
}
```

今までは欲しいJSON値の型に合わせて `Dictionary<TKey, TValue>` の `TValue` の型を定義していましたが、複数の型が必要な場合は <font color="Red">Object 型で定義</font> します。

| Key(String) | Value(<font color="Red">Object</font>) |
|:-----------:|:--------------------------------------:|
| "name"      | "Bob"                                  |
| "age"       | 24                                     |
| "active"    | true                                   |

ではStudioで実装してみます。

### Studio作成例

**変数設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/525d380a-9e52-5fd6-3258-dc18010cbb5a.png)

**ワークフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/3bc8a760-d9b8-60a0-ed38-ea236d081002.png)

**解説**

```vb
Dim jsonDic = New Dictionary(Of String, Object)
```

上記変数をStudio上で定義および初期化しているので、**Add to dictionary** アクティビティで要素を3つ追加します。

- 1つめの要素：Key="name", Value="Bob" (String)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/54527dc0-fbce-960d-a49e-10a7186fa056.png)
- 2つめの要素：Key="age", Value=24 (Int32)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/d549fcfb-d75c-3d5e-016e-794d48b27d8b.png)
- 3つめの要素：Key="active", Value=True (Boolean)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/aa45978b-2548-e234-b390-4e0d4d7e9060.png)

Dictionary を `Object` 型で定義したことで、変数値に複数の型を入力できているのがポイントです:point_up:

上記 Dictionary を、JSON文字列に自動変換:point_down:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/ea2b1b21-024b-c81f-6441-b5b68e9b058e.png)

バッチリですね！
このように <font color="Red">変数値に複数の型が必要な場合は、Dictionary の `TValue` は `Object` 型で定義</font> すると目的のJSONを簡単に作ることが出来ます。

# JSON値が配列の場合
JSON値には仕様上、以下のように配列を指定することができます。

```json:作りたいJSON
{
	"favorite_colors": [
		"red",
		"green",
		"blue"
	]
}
```

冒頭で記載したとおり、配列は `List<T>` で表現します。
上記のJSON値が必要な場合、Dictionary の `TValue` は `List<String>` 型で定義すると目的のJSONを作成可能です。

| Key(String)       | Value( <font color="Red">List\<String\></font> ) |
|:-----------------:|:------------------------------------------------:|
| "favorite_colors" | {"red", "green", "blue"}                         |

ではStudioで実装してみます。

### Studio作成例

**変数設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/2265343f-22c2-0125-4a07-e21ddbdf2cfc.png)

**ワークフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/3f0e1829-7934-4e94-f6f0-f0f8dde6c3f3.png)

**解説**

```vb
' favorite_colors の値用の List 型変数
Dim listColors = New List(Of String)

' JSON 作成用の Dictionary 型変数
Dim jsonDic = New Dictionary(Of String, List(Of String))
```

上記変数をStudio上で定義および初期化しています。

まずは `listColors` 変数に対して、"red" "green" "blue" の値を3つ追加します。
`List<String>` 型の変数へ値を追加する方法はいくつかありますが、今回はデフォルトで用意されている **コレクションに追加(Add To Collection)** アクティビティを使ってみます。

- "red" を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/88e7135b-4cee-eef0-1490-02cb6b72aa1f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/63d1563f-c5ff-b442-319d-918fef577fee.png)

- "green" を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/8b0677e0-d6f3-9d11-28ae-cb2f2e95597d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/0b6816e4-8d6d-8dc8-aa08-19b3a6cae28b.png)

- "blue" を追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/edaa31f8-cf45-6248-24ec-6e3935d75573.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/10d92964-90a4-71b0-932e-c77a7fd97418.png)

今までと同様、上記 `listColors` 変数を **Add to dictionary** アクティビティで追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/5a40be64-d188-96e5-beb2-f42e15984b30.png)

上記 Dictionary を、JSON文字列に自動変換:point_down:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/dc7ae491-47f5-8b2b-a8be-207a2c16b4d6.png)

配列の値がブラケット（[]）付きで出力されました！
このように <font color="Red">変数値に配列が必要な場合、Dictionary の `TValue` は `List<T>` 型で定義</font> すると目的のJSONを簡単に作ることが出来ます。

***
※補足※
「配列は `List<T>` で表現する」と記載しましたが、直接配列を定義しても同じ結果を取得することができます。
今回の例で言うと、`List<String>` ではなく `String(2)` という String型の配列でも実現可能です。

どちらが正解というわけではありませんが、直接配列を定義すると要素数の定義等で少し実装がややこしくなるため、個人的には `List<T>` で実装したほうがシンプルになるかと考えています。
***

# JSON値が オブジェクト型 の場合
以下のように、JSON値にはオブジェクト型も指定可能です。

```json:作りたいJSON
{
	"user_info": {
		"user_id": "A1234567",
		"user_name": "Bob"
	}
}
```

若干トリッキーですが、こういったケースは <font color="Red">Dictionary の値に、更に Dictionary を格納する</font> ことで対応可能です。
以下のイメージで変数を定義すればOKです。

| Key(String) | Value( <font color="Red">Dictionary\<String, String\></font> )  |
|:-----------:|:----------------------------------------------------------------|
| "user_info" | Dictionary\<String, String\>（←"user_id" と "user_name" を格納） |

若干イメージ湧きづらいかもしれませんね。
ではStudioで実装してみます。

**変数設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/b9f924a5-e687-7270-7235-167e9e6122c4.png)

**ワークフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/6923541f-9282-f2b1-70aa-82f23ec3dd46.png)

**解説**

```vb
' Bob の情報を格納する Dictionary
Dim BobDic = New Dictionary(Of String, String)

' Bob 用の Dictionary 自体を値に持つ、Dictionary
' （TValue は Object の定義でも可）
Dim jsonDic = New Dictionary(Of String, Dictionary(Of String, String))
```
上記変数をStudio上で定義および初期化しています。

まずはDictionary変数 `BobDic` に、Bob専用の情報を2つ格納します。

- 1つ目の要素：Key="user_id", Value="A1234567"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/63f6a78b-6036-6234-2f25-ec8413f59a8f.png)

- 2つ目の要素：Key="user_name", Value="Bob"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/fea8c31c-faf5-e025-3580-dc4d2fe19086.png)

次にそれを包み込むような形で、Dictionary 変数 `jsonDic` の値に上記 `BobDic` を格納します。

- Key="user_info", Value=`BobDic`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/db13a6eb-2f88-6fdf-a7c3-10a2c18d192d.png)

完成した Dictionary 変数 `jsonDic`を、JSON文字列に自動変換:point_down:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/60dc6c94-d953-6e88-0a49-628095e9cc96.png)

想定通りのJSONが出力されました！
JSONの仕様上、オブジェクトは階層構造を持つことができます。
<font color="Red">Dictionary の値の中に、更に Dictionary を格納する</font>ことで実現可能、ということが今回の重要なポイントです:point_up:

# JSON値が `null` の場合
JSON値には仕様上、null を指定することもできます。

### JSON値が文字列型の場合に `null` が必要なケース

```json:作りたいJSON
{
	"first_name": "Bob",
	"last_name": null
}
```

VB.NET での `null` の表現は `Nothing` ですから、必要な Dictionary は以下になる、というのは想像が付くかと思います。

| Key(String)  | Value(<font color="Red">String</font>) |
|:------------:|:--------------------------------------:|
| "first_name" | "Bob"                                  |
| "last_name"  | <font color="Red">Nothing</font>       |

ではStudioで実装してみます。

### Studio作成例

**変数設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/8ab4bf10-eb16-85f0-59f5-2a828b684cad.png)

**ワークフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/3c23d124-2e80-0083-3306-d416d37b1e65.png)

**解説**

```vb
Dim jsonDic = New Dictionary(Of String, String)
```

上記変数をStudio上で定義および初期化しているので、**Add to dictionary** アクティビティで要素を2つ追加します。

- 1つめの要素：Key="first_name", Value="Bob"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/90035f69-1bbb-8413-f1a2-f1d213b9fa21.png)

- 2つめの要素：Key="last_name", Value=<font color="Red">Nothing</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/969e0517-2e14-304e-9ec6-66219c9dc27d.png)

上記 Dictionary を、JSON文字列に自動変換:point_down:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/1b5865b6-1627-155b-7d17-b9f1c02edeb4.png)

想定通りのJSONが作成できました！
Dictionary の Value 値に Nothing を代入すると、JSON文字列に変換したときに <font color="Red">null</font> と正しく表現されているのがポイントです:point_up:

### JSON値が数値型の場合に `null` が必要なケース
数値型の場合は少し注意が必要です。例えば以下のケースで考えてみます。

```json:作りたいJSON
{
	"height": 173,
	"weight": null
}
```

今までの記事を参考にして、必要な Dictionary は以下で定義してみます。

| Key(String) | Value(<font color="Red">Int32</font>) |
|:-----------:|:-------------------------------------:|
| "height"    | 173                                   |
| "weight"    | <font color="Red">Nothing</font>      |

Studio での実装例は前項の String 型とほぼ同じであるため割愛しますが、注目したいのは以下の出力結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/0fe8a009-52ed-b152-c630-dc2b5503e05f.png)

なんと <font color="Red">weight がゼロで出力</font> されてしまいました…これは想定外ですね。
**Int32型の変数に Nothing を代入した結果は、0 という文字列で出力されてしまう**
ということを抑えておく必要があります。

対策として、以下の形で Dictionary を定義すると想定通りのJSONを取得することが出来ます。
（`TValue` の型を `Int32` ではなく、`Object` で定義する）

| Key(String) | Value(<font color="Red">~~Int32~~ Object</font>) |
|:-----------:|:------------------------------------------------:|
| "height"    | 173                                              |
| "weight"    | Nothing                                          |

上記 Dictionary を、JSON文字列に自動変換:point_down:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/2ebe4f36-0135-2735-ac86-605e270df260.png)

weight の値が <font color="Red">null</font> となりました、想定通りのJSONになりましたね！:clap:

### JSON値が真偽値の場合に `null` が必要なケース
真偽値の場合でも、数値型と同じ問題が発生します。例えば以下のケースです。

```json:作りたいJSON
{
	"active": true,
	"marriage": null
}
```

必要な Dictionary は以下で定義してみます。

| Key(String) | Value(<font color="Red">Boolean</font>) |
|:-----------:|:---------------------------------------:|
| "active"    | true                                    |
| "marriage"  | <font color="Red">Nothing</font>        |

こちらも Studio での実装例は割愛しますが、注目したいのは以下の出力結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/2c92513a-f7ae-5a39-6a8e-0f1025508783.png)

<font color="Red">marriage が false で出力</font> されてしまいました…。
**Boolean型の変数に Nothing を代入した結果は、false という文字列で出力されてしまう**
ということも合わせて抑えておく必要があります。

対策として、以下の形で Dictionary を定義すると想定通りのJSONを取得することが出来ます。
（`TValue` の型を `Boolean` ではなく、`Object` で定義する）

| Key(String) | Value(<font color="Red">~~Boolean~~ Object</font>) |
|:-----------:|:--------------------------------------------------:|
| "active"    | true                                               |
| "marriage"  | Nothing                                            |

上記 Dictionary を、JSON文字列に自動変換:point_down:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/db342d46-76ee-6be7-57df-a2955d608b20.png)

marriageの値が <font color="Red">null</font> となりました！:clap:

### null値が必要な場合のまとめ
変数へ `Nothing` 代入後、JSON文字列へ変換した際に出力される文字列をまとめます。

| 変数の型 | JSON変換後の値 | 結果    |
|:-------:|:-------------:|:-------:|
| String  | null          | **OK**  |
| Int32   | 0             | NG      |
| Boolean | false         | NG      |
| Object  | null          | **OK**  |

以上のことから、 **<font color="Red">JSON値に `null` が必要な場合、Dictionary の `TValue` の型は `Object` 型で定義</font>** しておくと良いでしょう。

# 最終章：目的のJSONを作成してみよう

ここまでの内容を抑えておけば、冒頭で触れた目的のJSONが作成可能になるはずです。

```json:作りたいJSON
{
	"families": [
		{
			"name": "Bob",
			"age": 24,
			"favorite_color": [
				"blue",
				"green"
			],
			"active": true
		},
		{
			"name": "Lisa",
			"age": null,
			"favorite_color": [
				"red",
				"purple"
			],
			"active": false
		}
	]
}
```

上記JSONを分解して必要な変数（と型）を割り当てられればOKなのですが、この複雑度だと頭の中だけで考えるのはツラくなってきますので図に起こしてみます。
左側が作成したいJSON、右側が対応する変数と型を定義した図です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/dba30373-6710-74dc-d37c-ae78b9565e80.png)

実務を想定すると「Bob用とLisa用で変数を分ける」という実装は有り得ないのですが、今回は話をシンプルにするためにあえて変数を分けています。
図を整理すると、以下の形になります。

- ①と②：Bob一人分の情報を格納する変数
- ③と④：Lisa一人分の情報を格納する変数
- ⑤Bob と Lisa をまとめる List<Object>
- ⑥全部をまとめる Dictionary<String, Object>

ここまで整理できれば Studio で実装が可能になります。
早速やってみます！

### Studio作成例

**変数設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/1ddad69b-8733-7015-01fd-cdbc4bf8119b.png)

**ワークフロー**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/d76ed469-5638-60ab-aab2-90a0fe5f383d.png)

**解説**
上記ワークフローだけだと全然わかりませんね(笑)
一つずつ記載していきます。

#### Bobの情報作成（変数①と②）

まずは Dictionary である `dicBob` 変数に以下の値を追加します。

| Key(String) | Value(Object) | 備考 |
|:-----------:|:-------------:|:-----|
| "name"      | "Bob"         | ←    |
| "age"       | 24            | ←    |

- 1つ目の要素 Key="name", Value="Bob"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/0ddc8af0-ffc4-5e6d-e30b-74a9647d4a67.png)

- 2つ目の要素 Key="age", Value=24
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/f4331c6a-bd1f-e573-ddec-b7e059f2eb7f.png)

次に List である `favColorsBob` に、Bob の好きな色を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/700dcba1-7ee2-a546-3698-6df896bb5139.png)

- 1つ目の要素 "blue"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/f0b62664-18bf-c4ae-e67f-b6c7d70daac6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/249410f9-c82b-0f46-1d1f-7905610b2416.png)

- 2つ目の色 "green"

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/10b8b75d-aa6c-d346-47b6-dca885690ab9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/853ba017-3346-db1c-0754-e607c61c155b.png)

作成したList変数 `favColorsBob` を、Bobの情報を格納するDictionary `dicBob` に追加します。

| Key(String)      | Value(Object)     | 備考 |
|:----------------:|:-----------------:|:-----|
| "name"           | "Bob"             |      |
| "age"            | 24                |      |
| "favorite_color" | {"blue", "green"} | ←    |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/89652e44-7fe8-4783-ee4a-9199f87d130d.png)

最後に active=True を `dicBob` に追加し、Bob 用の情報は全て格納完了となります。

| Key(String)      | Value(Object)     | 備考 |
|:----------------:|:-----------------:|:-----|
| "name"           | "Bob"             |      |
| "age"            | 24                |      |
| "favorite_color" | {"blue", "green"} |      |
| "active"         | True              | ←    |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/edc483a1-e52d-63be-8c15-34ac2023a660.png)

以上で Bob 一人分の情報を格納する Dictionary 変数である `dicBob` が完成しました！

#### Lisa の情報作成（変数③と④）

こちらは Bob の情報作成方法とほぼ同じであるため、実装内容は割愛します。
最終的に以下の形の Dictionary 変数 `dicLisa` が完成していればOKです！

| Key(String)      | Value(Object)     |
|:----------------:|:-----------------:|
| "name"           | "Lisa"            |
| "age"            | Nothing           |
| "favorite_color" | {"red", "purple"} |
| "active"         | False             |

#### Bob と Lisa をまとめる List<Object>（変数⑤）

次にList型変数 `familyList` に、Bob情報（dicBob）と、Lisa情報（dicLisa）を格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/a078ae25-9896-53b5-aead-c4e7a5997934.png)

- 1つ目の要素 `dicBob`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/d9ababe2-89fc-0196-eec9-095ffb202fb9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/283c016a-6aa4-794a-ca3d-833065110658.png)

- 2つ目の要素 `dicLisa`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/68b3221e-c04b-b7af-64cb-a54b288d4e37.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/e77fad9f-4be1-ca34-01b2-e57dfb6a951a.png)

#### 全部をまとめる Dictionary<String, Object>（変数⑥）

最後に今まで作成した変数をまとめる Dictionary型変数 `jsonDic` に値を格納します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/253295ab-37eb-15c6-dd58-fea1caf33886.png)

最後にこの `jsonDic` を、JSON文字列に自動変換:point_down:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368775/8d09facc-0aa1-7807-6a12-82f561189e47.png)

目的のJSON文字列を作成することができましたね:clap:

# 最後に

Dicationary と List の組み合わせだけで、JSONを自在に作成可能なことがわかりました！
もし他にもっとスマートなやり方等をご存じでしたら、ご指摘いただけますと幸いです。

# 参考にしたサイト、記事
下記の素晴らしい記事を参考にし、UiPathで色々と検証させていただきました。
ありがとうございます:bow_tone1:

- [UiPathでJSON文字列をDictionaryで生成する](https://qiita.com/masatomix/items/da8efe3691758ebcafe0)
- [JSON入門 - とほほのWWW入門]
(http://www.tohoho-web.com/ex/json.html)
- [JSONのparseを色々試してみた。]
(https://techinfoofmicrosofttech.osscons.jp/index.php?JSON%E3%81%AEparse%E3%82%92%E8%89%B2%E3%80%85%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%80%82)