You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:23:20