Unity使用JsonUtility.FromJsonOverwrite后DateTime属性为null如何解决
问题根因
Unity 自带的 JsonUtility 对 DateTime 类型的反序列化支持非常有限,仅能识别 ISO 8601 标准的带 T 分隔符的时间格式(例如 "2021-11-15T08:42:00"),你服务器返回的空格分隔时间格式无法被默认识别,因此会出现赋值失败的问题。
解决方案
不需要实现全量自定义映射器,两种低成本方案都可以满足你保留DateTime类型属性的需求:
方案1:最小改动兼容原生JsonUtility
新增序列化代理字段承接Json返回的字符串,手动转成DateTime类型即可,无需替换序列化工具:
namespace DataEntities { [System.Serializable] public class UserConnect { public string sessionid; public string username; public string img; public string role; public string firstname; public int iduser; // 用于承接Json返回的字符串格式时间,参与Json序列化 public string datelastconnection; // 实际业务使用的DateTime类型属性,不参与Json序列化 [System.NonSerialized] public System.DateTime DateLastConnection; // 反序列化完成后调用该方法完成时间转换 public void AfterDeserialize() { if (System.DateTime.TryParseExact( datelastconnection, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out var parsedDt)) { DateLastConnection = parsedDt; } } } }
调用逻辑只需加一行转换调用:
JsonUtility.FromJsonOverwrite(www.downloadHandler.text, this.userConnected); // 新增这行完成时间字段转换 this.userConnected.AfterDeserialize();
方案2:替换为兼容性更强的序列化库
你可以直接使用Unity适配版的Newtonsoft.Json(Json.NET),它对时间格式的兼容性更强,默认就能识别你当前的服务器返回时间格式,无需修改原有模型结构,仅需替换序列化方法即可:
原来的JsonUtility.FromJsonOverwrite(www.downloadHandler.text, this.userConnected)替换为:
Newtonsoft.Json.JsonConvert.PopulateObject(www.downloadHandler.text, this.userConnected);
内容的提问来源于stack exchange,提问作者Gelso77
相关产品推荐
相关产品推荐

