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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:36:03