反序列化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;
}
}
要解决这个问题,可能最简单的方法是将DataContract类型的值类型设置为'string'。然后,如果你需要使用。net datetimes,你需要做一个DateTime。解析字符串值。这将消除反序列化问题。被序列化的原始类很可能从一个字符串值开始,因为它缺少日期所需的格式。
注意,当你做一个DateTime。解析,如果有时区信息,它会将其转换为您计算机的本地时间(我知道这很愚蠢)。仅供参考。
JSON规范中没有日期交换的标准格式,这就是为什么JSON中有这么多不同的异构日期格式!
DataContractJsonSerializer
以Date()
包围的自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;
}
}