C# 使用JSON.net和.net WebApi反序列化时间跨度

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”,

我有一个利用EntityFramework4.1的ASP.NETWebAPI项目。我试图返回一个实体并利用JSON.net进行反序列化。但是,当尝试使用TimeSpan属性反序列化实体时,所有操作都正常运行,但出现以下异常:

无法从System.String强制转换或转换为System.TimeSpan

查看堆栈跟踪可以发现:

JsonSerializationException:转换值时出错 “PT17H9M43.1671969S”输入“System.TimeSpan”。路径“TimeIn”,第1行, 第890位

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);