反序列化Json对象 - DateTime

Sam*_*vdd 5 c# wpf web-services microsoft-metro

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

{System.Runtime.Serialization.SerializationException:反序列化User类型的对象时出错.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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

the*_*yer 9

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

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


Kam*_*eri 8

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

DataContractJsonSerializer序列化日期,自1970年以来计算msecs的格式包围了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);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您的应用程序是使用.Net 4.5的WPF/Winforms,只需添加对`System.Web.Extensions`的引用,但是如果您正在开发WinRT应用程序,那么您可以使用`System.Web.Extensions.dll`或像JSON.net这样的第三方库在这里找到:http://nuget.org/packages/Newtonsoft.Json (2认同)

Sam*_*vdd 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;
    }
Run Code Online (Sandbox Code Playgroud)