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

Unity中Socket.io返回JSON无法反序列化及键值访问问题

解决Unity中JSON反序列化无法访问键值的问题

第一步:捕获异常定位问题

先给代码添加异常捕获,明确反序列化失败的具体原因,比如日期格式不兼容、JSON字符串格式错误等:

socket.On("UserList", response =>
{
    try
    {
        var jsonStr = response.ToString();
        // 先打印原始JSON字符串,确认格式是否正确
        Debug.Log("Received JSON: " + jsonStr);
        var result = JsonConvert.DeserializeObject<List<UserClass>>(jsonStr);
        var first_name = result[0].first_name;
        Debug.Log(first_name);
    }
    catch (Exception ex)
    {
        Debug.LogError("反序列化失败:" + ex.Message);
        Debug.LogError("异常详情:" + ex.StackTrace);
    }
});

第二步:修正日期字段解析问题

如果是ISO 8601格式的日期导致解析失败,给UserClass的日期字段添加格式转换特性:

using Newtonsoft.Json.Converters;

public class UserClass
{
    public string _id { get; set; }
    public string first_name { get; set; }
    public string last_name { get; set; }
    public string mobile { get; set; }
    public string email { get; set; }
    
    [JsonConverter(typeof(IsoDateTimeConverter))]
    public DateTime createdAt { get; set; }
    
    [JsonConverter(typeof(IsoDateTimeConverter))]
    public DateTime updateAt { get; set; }
    
    public int __v { get; set; }
}

第三步:确保获取正确的JSON字符串

如果Socket返回的response不是纯字符串(比如是JArray/JObject类型),直接序列化后再使用:

// 替换response.ToString()为以下代码
var jsonStr = JsonConvert.SerializeObject(response);

第四步:验证Newtonsoft.Json包的正确性

确认Unity项目已正确安装Newtonsoft.Json:

  • 通过Unity Package Manager安装com.unity.nuget.newtonsoft-json包
  • 或手动将Newtonsoft.Json的.dll文件放入项目Plugins目录

替代方案:使用Unity内置JsonUtility

如果不想依赖第三方库,可使用Unity自带的JsonUtility,但它不支持顶级数组,需要包装一个类:

// 数组包装类
[System.Serializable]
public class UserListWrapper
{
    public List<UserClass> users;
}

// 标记可序列化的UserClass
[System.Serializable]
public class UserClass
{
    public string _id;
    public string first_name;
    public string last_name;
    public string mobile;
    public string email;
    public string createdAt; // 先存为字符串,后续再转换为DateTime
    public string updateAt;
    public int __v;
}

// 反序列化代码
socket.On("UserList", response =>
{
    try
    {
        var jsonStr = response.ToString();
        // 给JSON添加外层包装
        var wrappedJson = "{\"users\":" + jsonStr + "}";
        var wrapper = JsonUtility.FromJson<UserListWrapper>(wrappedJson);
        var first_name = wrapper.users[0].first_name;
        Debug.Log(first_name);
        // 手动转换日期
        DateTime createdAt = DateTime.Parse(wrapper.users[0].createdAt);
    }
    catch (Exception ex)
    {
        Debug.LogError("反序列化失败:" + ex.Message);
    }
});

内容的提问来源于stack exchange,提问作者karimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:35:21