如何在C#中反序列化Firebase返回的JSON对象(Unity环境)
Unity中用JsonUtility/JsonHelper反序列化键值对JSON的解决方案
问题分析
你提供的JSON是以随机字符串为键、用户对象为值的字典结构,Unity原生JsonUtility默认不支持直接序列化/反序列化Dictionary类型,这是无法得到有效结果的核心原因。
解决方案
1. 定义可序列化的User模型
首先创建基础用户类,必须标记[Serializable]才能被JsonUtility识别:
using UnityEngine; using System; [Serializable] public class User { public string userID; }
2. 扩展JsonHelper处理字典反序列化
如果你的JsonHelper没有内置字典支持,扩展它来适配这种结构:
public static class JsonHelper { public static T FromJson<T>(string json) { var targetType = typeof(T); // 判断是否为Dictionary类型 if (targetType.IsGenericType && targetType.GetGenericTypeDefinition() == typeof(Dictionary<,>)) { using (var doc = JsonDocument.Parse(json)) { var dict = (IDictionary)Activator.CreateInstance(targetType); var valueType = targetType.GetGenericArguments()[1]; foreach (var prop in doc.RootElement.EnumerateObject()) { // 反序列化每个用户对象 var userObj = JsonUtility.FromJson(prop.Value.ToString(), valueType); dict.Add(prop.Name, userObj); } return (T)dict; } } // 非字典类型用原生JsonUtility处理 return JsonUtility.FromJson<T>(json); } }
3. 调用示例
string rawJson = "{\"-NBDmMEcFMNkPynkW3tG\":{\"userID\":\"-NBDmMEcFMNkPynkW3tG\"},\"-NBDmO1uKeY22QD5H5DJ\":{\"userID\":\"-NBDmO1uKeY22QD5H5DJ\"}}"; // 反序列化为字典 Dictionary<string, User> userDictionary = JsonHelper.FromJson<Dictionary<string, User>>(rawJson); // 验证结果 foreach (var pair in userDictionary) { Debug.Log($"Key: {pair.Key}, UserID: {pair.Value.userID}"); }
替代方案:使用Newtonsoft.Json(允许第三方库时)
如果项目可以引入第三方库,在Unity Package Manager中搜索安装com.unity.nuget.newtonsoft-json,之后可直接反序列化:
using Newtonsoft.Json; Dictionary<string, User> userDict = JsonConvert.DeserializeObject<Dictionary<string, User>>(rawJson);
注意事项
- Unity版本需≥2020,否则
JsonDocument不可用,建议直接用Newtonsoft.Json替代。 - 所有自定义类必须添加
[Serializable]属性,否则JsonUtility无法识别字段。 - 若原有
JsonHelper已支持字典处理,直接使用即可,无需重复扩展。
内容的提问来源于stack exchange,提问作者CosmicSeizure
相关产品推荐
相关产品推荐

