質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3537閲覧

ルート階層が配列のJSONのデシリアライズ方法

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/11/12 07:05

編集2021/11/12 07:06

前提・実現したいこと

ルート階層が配列のJSONをデシリアライズをするには、どのようにすればよいでしょうか?
ご教示お願いします。

試したこと

まず、ルートが直に配列でないJSONのデシリアライズを試してみました。
こちらの内容は今回の質問の疑問点ではありませんが、
そもそも配列形式のJSONがデシアライズできるかどうかを確認するために試してみました。

下記のようにJSONとクラスを用意しました。

JSON

1{ 2 "items":[ 3 { 4 "id": 1, 5 "name":"water" 6 }, 7 { 8 "id": 2, 9 "name":"knife" 10 }, 11 { 12 "id": 3, 13 "name":"apple" 14 } 15 ] 16}

C#

1using UnityEngine; 2 3[System.Serializable] 4public class Item 5{ 6 public int id; 7 public string name; 8} 9 10[System.Serializable] 11public class Items 12{ 13 14 public Item[] items; 15 16 public static Items CreateFromJSON(string jsonString) 17 { 18 return JsonUtility.FromJson<Items>(jsonString); 19 } 20 21}

実行すると、下記のようにログが取れました。
意図通りのことはできましたが、JSONの定義やプロパティへのアクセスが冗長です
(JSONのルートが直に配列でない、アクセスするのに、items.items~としなければならない)。

C#

1 Items items = Items.CreateFromJSON(jsonData.text); 2 Debug.Log(items.items[0].id); // 1 3 Debug.Log(items.items[0].name); // water 4 Debug.Log(items.items[1].id); // 2 5 Debug.Log(items.items[1].name); // knife 6 Debug.Log(items.items[2].id); // 3 7 Debug.Log(items.items[2].name); // apple

そこで、以下のJSONをデシリアライズすることが今回の質問です。
こちらのサイトでチェックしたところ、以下のJSONは形式として正しいことが確認できました。

JSON

1[ 2 { 3 "id": 1, 4 "name":"water" 5 }, 6 { 7 "id": 2, 8 "name":"knife" 9 }, 10 { 11 "id": 3, 12 "name":"apple" 13 } 14]

以下のように組んでみましたが、

C#

1using UnityEngine; 2 3[System.Serializable] 4public class Item 5{ 6 public int id; 7 public string name; 8} 9 10[System.Serializable] 11public class Items 12{ 13 public static Item[] CreateFromJSON(string jsonString) 14 { 15 return JsonUtility.FromJson<Item[]>(jsonString); 16 } 17 18}

C#

1 Item[] items = Items.CreateFromJSON(jsonData.text); 2 Debug.Log(items[0].id); // 3 Debug.Log(items[0].name); // 4 Debug.Log(items[1].id); // 5 Debug.Log(items[1].name); // 6 Debug.Log(items[2].id); // 7 Debug.Log(items[2].name); //

以下のようなエラーが出てしまいました。

ArgumentException: JSON must represent an object type. UnityEngine.JsonUtility.FromJson (System.String json, System.Type type) (at <3e7f43c38e214491a21ee815b941dbb6>:0) UnityEngine.JsonUtility.FromJson[T] (System.String json) (at <3e7f43c38e214491a21ee815b941dbb6>:0) Items.CreateFromJSON (System.String jsonString)

このようなJSONをデシリアライズするには、どういったコードを組めばよいでしょうか?
JSONの形式としては正しいと確認ができているので、方法があるのではないかと思っています。
ご教示お願いします。

補足情報(FW/ツールのバージョンなど)

Unity 2021.1.7f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2021/11/12 07:17

「jsonutility.fromjson 配列 ルート」と検索したらある程度情報があるようでした
退会済みユーザー

退会済みユーザー

2021/11/12 07:42

ご指摘ありがとうございます。 検索結果をもとに勉強したいと思います。
guest

回答1

0

ベストアンサー

投稿2021/11/12 07:44

編集2021/11/12 07:45
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問