反序列化Json对象-日期时间

本文关键字:日期 时间 对象 Json 反序列化 | 更新日期: 2023-09-27 17:49:30

我的web-api返回一个用户对象。这个物体有一个DateTime属性。当我在我的应用程序中读取它时,我得到一个错误,因为表示日期时间的字符串无效,它缺少'Date ...

{System.Runtime.Serialization。SerializationException:存在反序列化用户类型对象时出错。DateTime内容'1984-10-02T01:00:00'不以'/Date('开始,以')/'结束根据JSON的要求。——>

public static async Task<User> GetUser(string email)
    {
        try
        {
            using (HttpClient client = new HttpClient())
            {
                HttpResponseMessage response = await client.GetAsync(url + "?email="+email);
                if (response.IsSuccessStatusCode)
                {
                    string content = await response.Content.ReadAsStringAsync();
                    User user = DataService.Deserialize<User>(content);
                    return user;
                }
                return null;
            }
        }
        catch (Exception ex)
        {
            return null;
        }
    }

这是我用来反序列化的方法。

public static T Deserialize<T>(string json) {
        try
        {
            var _Bytes = Encoding.Unicode.GetBytes(json);
            using (MemoryStream _Stream = new MemoryStream(_Bytes))
            {
                var _Serializer = new DataContractJsonSerializer(typeof(T));
                return (T)_Serializer.ReadObject(_Stream);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

反序列化Json对象-日期时间

要解决这个问题,可能最简单的方法是将DataContract类型的值类型设置为'string'。然后,如果你需要使用。net datetimes,你需要做一个DateTime。解析字符串值。这将消除反序列化问题。被序列化的原始类很可能从一个字符串值开始,因为它缺少日期所需的格式。

注意,当你做一个DateTime。解析,如果有时区信息,它会将其转换为您计算机的本地时间(我知道这很愚蠢)。仅供参考。

JSON规范中没有日期交换的标准格式,这就是为什么JSON中有这么多不同的异构日期格式!

DataContractJsonSerializerDate()包围的自1970年以来计数msecs的格式序列化日期,类似于:Date(1335205592410),并期望将相同的格式反序列化回DateTime。然而,你得到的JSON日期字符串是ISO8601格式,这是大多数浏览器/软件今天用来序列化日期的格式!

JavaScriptSerializer是。net中的另一个JSON序列化器,它几乎可以序列化任何类型,包括JSON字符串的匿名类型,并且它能够以ISO8601格式或DataContractJsonSerializer提供的格式反序列化JSON日期。

使用JavaScriptSerializer,你的反序列化方法看起来像这样:

public static T Deserialize<T>(string json)
{
    return new JavaScriptSerializer().Deserialize<T>(json);
}

我发现如何修复它时添加包Json.net (Newtonsoft.Json)

public async static Task<T> Deserialize<T>(string json)
    {
        var value = await Newtonsoft.Json.JsonConvert.DeserializeObjectAsync<T>(json);
        return value;
    }

可能是DateTime实际上作为"可空"返回,如"DateTime " ?(带问号)?

因为那样的话,它可能是NULL, as和"。HasValue == false".

只是猜测…: -)

只需更改DataContractJsonSerializer上的DateTimeFormat,如下所示:

    public static T Deserialize<T>(string json) {
    try
    {
        var settings = new DataContractJsonSerializerSettings 
        {
            DateTimeFormat = new System.Runtime.Serialization.DateTimeFormat("o")
        };
        var _Bytes = Encoding.Unicode.GetBytes(json);
        using (MemoryStream _Stream = new MemoryStream(_Bytes))
        {
            var _Serializer = new DataContractJsonSerializer(typeof(T), settings);
            return (T)_Serializer.ReadObject(_Stream);
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}