C# 使用JSON.net和.net WebApi反序列化时间跨度
我有一个利用EntityFramework4.1的ASP.NETWebAPI项目。我试图返回一个实体并利用JSON.net进行反序列化。但是,当尝试使用TimeSpan属性反序列化实体时,所有操作都正常运行,但出现以下异常: 无法从System.String强制转换或转换为System.TimeSpan 查看堆栈跟踪可以发现: JsonSerializationException:转换值时出错 “PT17H9M43.1671969S”输入“System.TimeSpan”。路径“TimeIn”,第1行, 第890位C# 使用JSON.net和.net WebApi反序列化时间跨度,c#,json,asp.net-web-api,json.net,timespan,C#,Json,Asp.net Web Api,Json.net,Timespan,我有一个利用EntityFramework4.1的ASP.NETWebAPI项目。我试图返回一个实体并利用JSON.net进行反序列化。但是,当尝试使用TimeSpan属性反序列化实体时,所有操作都正常运行,但出现以下异常: 无法从System.String强制转换或转换为System.TimeSpan 查看堆栈跟踪可以发现: JsonSerializationException:转换值时出错 “PT17H9M43.1671969S”输入“System.TimeSpan”。路径“TimeIn”,
response.Content.ReadAsStringAsync().Result的输出为:
{“CreatedDate”:“/Date(1329851383157-0500)/”,“ServicerUserId”:6,“TimeIn”:“PT17H9M43.1671969S”,“TimeOut”:“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);
}
}
如果您有任何关于如何反序列化TimeSpan的想法,我们将不胜感激。解决方案是将WebApi项目配置为在global.asax应用程序启动事件中默认利用JSON.net进行序列化,如中所述
您能用response.Content.ReadAsStringAsync().Result的值更新您的问题吗?另外,由于您没有显式显示您的服务器HttpConfiguration,我将假设您使用的是默认的格式化程序。然而,您希望使用Json.NET反序列化响应。理想情况下,您应该有一个Json.NET媒体类型格式化程序,并将服务器配置为使用它,并确保您的客户端在读取诸如response.content.ReadAsAsync(new[]{new JsonNetFormatter()})之类的内容时使用它.result您接受了自己的答案,但答案仅部分正确。你问题的真正答案在于我上面的评论。反序列化由客户端而不是服务器处理。在这两种情况下都需要使用Json.NET格式化程序。客户端不受服务器配置的影响。
// 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;
}
// 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);