解決したい問題
JsonUtility.ToJson()でJSONに変換したクラス配列データの要素にnullの要素があった時、クラスのフィールド変数の型の初期値が入るようです。JSONに変換するだけで配列に値が入ってしまうようで、nullチェックなどが通用しなくなって困っています。配列に要素を入れないようにする方法はありますでしょうか?
該当のソースコード
データ用クラス ItemData
C#
1using System; 2using UnityEngine; 3 4[Serializable] 5public class ItemData 6{ 7 [SerializeField] int id; 8 [SerializeField] string name; 9 10 public int ID { get { return id; } } 11 public string NAME { get { return name; } } 12 13 public ItemData(int id, string name) 14 { 15 this.id = id; 16 this.name = name; 17 } 18}
データ管理用クラス ItemManager
C#
1using System; 2using UnityEngine; 3 4[Serializable] 5public class ItemManager 6{ 7 // 簡易的なシングルトン 8 public static ItemManager Instance { get { return instance; } } 9 10 private static ItemManager instance = new ItemManager(); 11 12 private ItemManager() 13 { 14 Debug.Log("Created Instance."); 15 } 16 17 // JSONに変換したいクラス配列 18 [SerializeField] private ItemData[] itemDataArray = new ItemData[5]; 19 20 // アイテムをnullのインデックスに格納 21 public void CreateItemData() 22 { 23 for(int i = 0; i < itemDataArray.Length; i++) { 24 if(itemDataArray[i] == null) { 25 itemDataArray[i] = new ItemData(i, "Test" + i.ToString()); 26 break; 27 } 28 } 29 } 30 31 // 配列をJSONに変更(外部にデータ保存のため) 32 public void ConvertToJson() 33 { 34 string json = JsonUtility.ToJson(ItemManager.Instance); 35 Debug.Log(json); 36 } 37 38 // Debug.Log()にアイテムの名前一覧を表示 39 public void PrintData() 40 { 41 for(int i = 0; i < itemDataArray.Length; i++) { 42 if(itemDataArray[i] != null) { 43 Debug.Log(itemDataArray[i].NAME); 44 } 45 } 46 } 47}
実際にデータクラスを呼ぶクラス
using UnityEngine; public class Test : MonoBehaviour { private void Start() { // 適当に3つくらいデータを格納する ItemManager.Instance.CreateItemData(); ItemManager.Instance.CreateItemData(); ItemManager.Instance.CreateItemData(); // まずはそのまま表示 ItemManager.Instance.PrintData(); // Jsonに変換 ItemManager.Instance.ConvertToJson(); // Jsonに変換してからまた表示すると、なぜか値が入っている ItemManager.Instance.PrintData(); } }
出力結果
Jsonにシリアライズしてから表示すると、nullチェックが効いていない
開発環境
- Unity 2019.4.15f
現状の回避方法
// 配列をJSONに変更(外部にデータ保存のため) public void ConvertToJson() { string json = JsonUtility.ToJson(ItemManager.Instance); Debug.Log(json); // 現状の回避方法として、配列要素が初期値になっていたら // nullにするという方法をとっていますが、そのためにこの処理を追加するのもつらいです for(int i = 0; i < itemDataArray.Length; i++) { if(itemDataArray[i].NAME == null) { itemDataArray[i] = null; } } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/15 00:07