PlayMaker EcosystemにあるJSONパース系のActionを片っ端から調べてみた

これは [STYLY Advent Calendar 2023](https://qiita.com/advent-calendar/2023/styly) の13日目の記事です。


# PlayMaker EcosystemにあるJSONパース系のActionを片っ端から調べてみた

PlayMakerで開発をしていると、 **JSONをパースしたい！** と思うことがあると思います。

とくによくあるのが、 **WebAPIのHTTPレスポンスがJSON形式なので、それをパースしたい！** という状況です。

そこで、PlayMakerの拡張機能をまとめている `PlayMaker Ecosystem` を調べてみました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/faadf2e3-464e-d251-dc84-6073c63087e5.png)

`JSON` と名の付くActionがいっぱいあーるじゃないですかー！わくわく！

というわけで、全部調べみました！

# 結論: 実用に耐えるActionはない！

一番気になっている「HTTPの応答解析に使えるのか？」という観点ですが、さきに結論から書くと、

**応答解析に使えるActionは一つもありません！**

・・・いや、使えんのかーい！！

本記事は、あくまで私が **趣味で調べた結果を共有する内容となっております！**

また、STYLYアドベントカレンダーに応募しているので、非常に紛らわしいですが、 **STYLYで使えるノウハウを紹介する記事でもありません！** 

それでも良い方のみ、ここから先をお読みください！

# PlayMaker Ecosystemが必要

PlayMaker Ecosystemの導入方法はこちらをご覧ください。

https://hutonggames.fogbugz.com/?W1181

ちなみに、 **STYLYはEcosystemをサポートしていなので、ご注意ください！**

繰り返しになりますが、私が趣味で調べた結果を共有する記事となっております！

**STYLYで使えるノウハウを紹介する記事ではありません！** ごめんなさい！


# Action 1 : `ExtractFromJson`

トップバッターは `ExtractFromJson` です！

いかにもJSONをパースできそうな名前です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/d98f85d0-1863-f338-19f0-0f32a22f1cd6.png)

ソースコードはこちらです。

- [PlayMakerCustomActions_Misc / HashTable / ExtractFromJson](https://github.com/PlayMakerEcosystem/PlayMakerCustomActions_Misc/blob/master/Assets/PlayMaker%20Custom%20Actions/HashTable/ExtractFromJson.cs)

こちらのアクションですが、以下のような **1階層のみ** のJSON文字列をパースできます！

```json
{
  "hoge": 0,
  "fuga": true,
  "piyo": "foo"
}
```

`Extract` 欄にkeyを指定すると、 `Result` 欄にvalueが格納されるんですね。
たとえば、 `Extract` に `fuga` と指定すると、 `Result` には `true` が格納されます！

`Result` の型は動的に決まります。（すごい！）

ただ、以下のような多階層のJSONはパースできません！

```json
{
  "hoge": {
    "fuga": true,
    "piyo": {
      "foo": "bar"
    }
  }
}
```

WebAPIの応答は、一般的に多階層のJSONですので、パースできないんですね。。。

# Action 2 : `HashTableAddFromJson`

エントリーナンバー2は `HashTableAddFromJson` です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/7956e0aa-c164-565a-6c9b-af45a65160aa.png)

ソースコードはこちらです。

- [PlayMakerCustomActions_Misc / HashTable / HashTableAddFromJson](https://github.com/PlayMakerEcosystem/PlayMakerCustomActions_Misc/blob/master/Assets/PlayMaker%20Custom%20Actions/HashTable/HashTableAddFromJson.cs)

こちらのアクションも、以下のような **1階層のみ** のJSON文字列をパースできます！

```json
{
  "hoge": 0,
  "fuga": true,
  "piyo": "foo"
}
```

パースした結果を、`Reference` 欄のHashTableに格納できるんですね！

HashTableというのは、いわゆる連想配列のことで、 PlayMaker Ecosystemの `Array Maker` というパッケージをインストールすると使えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/b7cd70fa-86e2-16e4-6f43-5427c9074b54.png)

こちらのアクションも多階層のJSONはパースできないので、WebAPIの応答解析には使えないですね。。。

# Action 3 : `JsonLoad`

`PlayMakerCustomActions_U2019` に `JsonLoad` というActionがあります！
どんなJSONでも読み込んでくれそうな名前で、期待せざるを得ません！

ソースコードはこちらです。

- [PlayMakerCustomActions_U2019 / JsonLoad](https://github.com/PlayMakerEcosystem/PlayMakerCustomActions_U2019/blob/master/Assets/PlayMaker%20Custom%20Actions/Files/JsonLoad.cs)

こちらのアクションですが、 **以下のような階層構造を持ったJSONのみ** 、パースできます！

```json
{
  "savedFloat": [
    {
      "useVariable": true,
      "name": "InputFloat1",
      "tooltip": "",
      "showInInspector": false,
      "networkSync": false,
      "value": 1.100000023841858
    },
    {
      "useVariable": true,
      "name": "InputFloat2",
      "tooltip": "",
      "showInInspector": false,
      "networkSync": false,
      "value": 2.200000047683716
    }
    // 中略
  ],
  "savedInt": [
    // 中略
  ],
  "savedString": [
    // 中略
  ],
  "savedBool": [
    // 中略
  ],
  "savedVector2s": [
    // 中略
  ],
  "savedVector3s": [
    // 中略
  ],
  "savedArray": [
    // 中略
  ]
}
```

`savedFloat` や `savedInt` といった **キー名は、全部固定です！**
この形式に則っていないJSONはパースできません！

実は、この `JsonLoad` アクションは、汎用的なものではなく、 `JsonSave` アクションで出力されたJSONファイル専用のローダーなんですね！

`JsonSave` はこんな風に、パラメーターの配列をファイル出力することができるアクションです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/4a44686e-1843-ecaf-de94-3410c8093f56.png)

反対に、 `JsonLoad` は、こんな風に、パラメーターの配列をファイルから読み込むことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/2de85e95-0ff4-abc0-8bbf-9f7f1acea04e.png)

任意の形式のJSONをパースすることができるわけではないので、WebAPIの応答解析には使えませんね！


# さいごに

どのActionも、WebAPIの応答解析に使えそうにないことがわかりました！
どれも何年も前からほとんど保守されておらず、不安定なものが多い印象です。

繰り返しになりますが、私が趣味で調べた結果を共有する記事となっております！

**STYLYで使えるActionを紹介する記事ではありません！**

そのあたりを期待していた方にはごめんなさい！

本記事作成にあたり、以下のサイトを参考にさせていただきました。ありがとうございました。

- [PlayMaker Ecosystem](https://hutonggames.fogbugz.com/?W1181)
- [Array Maker](https://hutonggames.fogbugz.com/?W715)
- [Data Maker](https://hutonggames.fogbugz.com/?W1133)

# 宣伝

Psychic VR LabではUnityエンジニア・サーバーサイドエンジニアを募集しています！！ご応募お待ちしています！！

https://www.wantedly.com/projects/1360135

https://www.wantedly.com/projects/1360123