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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:10:28