我有一个使用Entity Framework 4.1的ASP.NET WebApi项目。我试图返回一个实体并利用JSON.net进行反序列化。一切都运行良好但是当尝试使用TimeSpan属性反序列化实体时,我会遇到以下异常:
无法从System.String转换或转换为System.TimeSpan。
查看堆栈跟踪显示:
JsonSerializationException:转换值时出错 “PT17H9M43.1671969S”键入'System.TimeSpan'。路径'TimeIn',第1行, 位置890。
response.Content.ReadAsStringAsync().Result
的输出是:
{ “CreatedDate”: “/日期(1329851383157-0500)/”, “ServicerUserId”:6, “TimeIn”: “PT17H9M43.1671969S”, “超时”: “PT17H28M43.1671969S”}
在使用JSON.net之前,我已成功使用System.Runtime.Serialization.JsonDataContractJsonSerializer
进行反序列化,但是我宁愿不使用此方法。
用于从WebApi获取实体的代码
public T Get<T>(object id)
{
using (var httpClient = NewHttpClient())
{
var response = httpClient.GetAsync(_endpoint + id.ToString()).Result;
return JsonConvert.DeserializeObject<T>(response.Content.ReadAsStringAsync().Result);
}
}
WebApi控制器中用于返回实体的代码:
// GET /api/services/5
public Service Get(Guid id)
{
var entry = db.Services.Find(id);
if (entry == null)
throw new HttpResponseException(HttpStatusCode.NotFound);
return entry;
}
有关如何反序列化TimeSpan的任何想法都将非常感激。
答案 0 :(得分:2)
解决方案是配置WebApi项目,以便在http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx
引用的global.asax Application_Start事件中默认利用JSON.net进行序列化。 // Create Json.Net formatter serializing DateTime using the ISO 8601 format
JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
GlobalConfiguration.Configuration.Formatters[0] = new JsonNetFormatter(serializerSettings);