Unity中如何序列化与反序列化Dictionary<string,List<string>>?
解决Unity中JsonUtility无法序列化字典的问题
方案1:用可序列化键值对列表适配现有JsonUtility流程
JsonUtility原生不支持Dictionary类型,但对List和自定义可序列化类支持良好。你可以在ConfigSave类中新增一个仅用于序列化的中间列表,通过转换逻辑衔接原有字典字段,不用拆分文件或新增独立类:
- 定义可序列化的键值对辅助类:
[Serializable] public class OutfitEntry { public string characterName; public List<string> outfits; }
- 修改
ConfigSave类,添加转换逻辑:
[Serializable] public class ConfigSave { // 原字典字段,标记为[NonSerialized]避免被JsonUtility直接处理 [NonSerialized] public Dictionary<string, List<string>> outfits = new Dictionary<string, List<string>>(); // 用于JsonUtility序列化的中间列表 public List<OutfitEntry> outfitEntries = new List<OutfitEntry>(); // 序列化前调用:将字典转成列表 public void PrepareForSave() { outfitEntries.Clear(); foreach (var kvp in outfits) { outfitEntries.Add(new OutfitEntry { characterName = kvp.Key, outfits = kvp.Value }); } } // 反序列化后调用:将列表转回字典 public void AfterLoad() { outfits.Clear(); foreach (var entry in outfitEntries) { outfits[entry.characterName] = entry.outfits; } } }
- 适配现有流程:
- 保存时:先调用
PrepareForSave(),再用JsonUtility.ToJson()序列化整个ConfigSave对象 - 加载时:先反序列化得到
ConfigSave实例,再调用AfterLoad()恢复字典数据
方案2:替换为Newtonsoft.Json(Unity官方支持)
如果不想写转换逻辑,可以直接用Unity官方集成的Newtonsoft.Json包,它原生支持字典序列化,且完全兼容你现有所有字段类型:
- 打开Unity Package Manager,导入
com.unity.nuget.newtonsoft-json包 - 替换原有序列化/反序列化代码:
- 保存逻辑:
string json = Newtonsoft.Json.JsonConvert.SerializeObject(configSaveInstance, Newtonsoft.Json.Formatting.Indented); File.WriteAllText(savePath, json);
- 加载逻辑:
string json = File.ReadAllText(savePath); ConfigSave configSaveInstance = Newtonsoft.Json.JsonConvert.DeserializeObject<ConfigSave>(json);
这种方式无需修改ConfigSave类结构,直接替换原有的JsonUtility调用即可,后续遇到复杂类型序列化也更省心。
内容的提问来源于stack exchange,提问作者Klausbdl
相关产品推荐
相关产品推荐

