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
相关产品推荐
相关产品推荐

