7

web-api返回一个用户对象。在那个对象中有一个DateTime属性。当我在我的应用程序中读取它时,我收到一个错误,因为代表 DateTime 的字符串无效,它丢失了\Date ...

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

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;
        }
    }
4

5 回答 5

9

要解决这个问题,最简单的方法可能是将 DataContract 类型的值类型设置为“字符串”。然后,如果您需要使用 .NET 日期时间,则需要对字符串值执行 DateTime.Parse。这将消除您的反序列化问题。被序列化的原始类很可能使用字符串值开头,因为它缺少所需的日期格式。

请注意,当您执行 DateTime.Parse 时,如果存在时区信息,它会将其转换为您计算机的本地时间(我知道这很愚蠢)。仅供参考。

于 2012-12-26T17:34:56.707 回答
9

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

DataContractJsonSerializer以自 1970 年以来以毫秒为单位的格式序列化日期,并被以下内容包围Date()Date(1335205592410)并期望相同的格式反序列化回DateTime. 但是,您得到的 JSON 日期字符串是 ISO8601 格式,这是当今大多数浏览器/软件用于序列化日期的格式!

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

使用JavaScriptSerializer,您的 Deserialize 方法将如下所示:

public static T Deserialize<T>(string json)
{
    return new JavaScriptSerializer().Deserialize<T>(json);
}
于 2012-12-26T19:12:09.903 回答
7

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

public async static Task<T> Deserialize<T>(string json)
    {
        var value = await Newtonsoft.Json.JsonConvert.DeserializeObjectAsync<T>(json);
        return value;
    }
于 2012-12-27T10:13:12.013 回答
1

会不会是 DateTime 实际上是作为“可为空的”返回的,比如“DateTime”?(带问号)?

因为那时,它可能是 NULL,因为和“.HasValue == false”。

只是在这里猜测...... :-)

于 2012-12-26T20:47:12.187 回答
1

只需像这样更改 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;
    }
}
于 2014-07-07T11:00:26.953 回答