前提・実現したいこと
ルート階層が配列の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
回答1件
あなたの回答
tips
プレビュー