使用JsonUtility序列化时RewardItem始终为空的技术求助
嘿,我帮你排查下JsonUtility序列化RewardItem为空的问题,这在刚用Unity的JsonUtility时确实很容易踩坑!下面是最常见的几个原因和对应解决方法:
排查JsonUtility序列化RewardItem为空的核心原因
1. 忘记给类/字段添加序列化标记
JsonUtility只认带[Serializable]特性的类,以及类里的public字段或带[SerializeField]的私有字段。如果你的RewardItem或Quest_List没加这个标记,直接会被序列化忽略。
举个正确的写法示例:
// 必须加[Serializable]才能被JsonUtility识别 [Serializable] public class RewardItem { // public字段默认会被序列化 public int gold; public string itemName; // 私有字段要加[SerializeField]才会被序列化 [SerializeField] private int exp; } [Serializable] public class Quest_List { public List<RewardItem> rewards; // 其他业务字段... }
2. 包装器结构不符合JsonUtility要求
JsonUtility不能直接序列化List/数组这类顶层集合,必须用一个包装类包裹起来。如果你的包装器写法错误,比如直接序列化List<Quest_List>,肯定会出现空数据。
正确的包装器写法:
[Serializable] public class QuestListWrapper { // 用一个字段包裹你的目标列表 public List<Quest_List> questList; }
序列化时要针对包装器实例操作:
// 初始化包装器并填充数据 var wrapper = new QuestListWrapper(); wrapper.questList = new List<Quest_List>(); wrapper.questList.Add(new Quest_List { rewards = new List<RewardItem> { new RewardItem { gold = 100, itemName = "新手药水" } } }); // 序列化并存储到PlayerPrefs string json = JsonUtility.ToJson(wrapper); PlayerPrefs.SetString("SavedQuests", json); PlayerPrefs.Save();
3. 反序列化时类型不匹配
从PlayerPrefs读取时,必须反序列化为包装器类型,而不是直接的List或Quest_List。比如错误写法会直接返回空:
// 错误:直接反序列化为List,JsonUtility不支持 var wrongList = JsonUtility.FromJson<List<Quest_List>>(savedJson);
正确的反序列化写法:
string savedJson = PlayerPrefs.GetString("SavedQuests"); if (!string.IsNullOrEmpty(savedJson)) { var wrapper = JsonUtility.FromJson<QuestListWrapper>(savedJson); // 这里就能正确拿到包含RewardItem的列表 var firstQuestRewards = wrapper.questList[0].rewards; Debug.Log("第一个任务奖励金币:" + firstQuestRewards[0].gold); }
4. 别用属性(Property)代替字段
JsonUtility完全不支持序列化get/set属性,只能序列化字段。比如下面的写法会导致RewardItem数据为空:
[Serializable] public class RewardItem { // 这是属性,JsonUtility不会序列化它 public int Gold { get; set; } }
必须改成字段形式:
[Serializable] public class RewardItem { public int gold; }
快速验证小技巧
你可以把序列化后的Json字符串格式化打印出来,直接看有没有RewardItem的内容:
string json = JsonUtility.ToJson(wrapper, true); // 第二个参数true是格式化输出,方便查看 Debug.Log("序列化后的Json:\n" + json);
如果Json里根本没有RewardItem的字段,那是序列化阶段的问题(比如没加Serializable);如果Json里有数据但反序列化后为空,那大概率是反序列化类型不对或字段名大小写不匹配(JsonUtility大小写敏感)。
内容的提问来源于stack exchange,提问作者JoeyL
相关产品推荐
相关产品推荐

