使用JSON.net和.net WebApi反序列化TimeSpan

时间:2012-05-11 14:26:19

标签: c# json asp.net-web-api json.net timespan

我有一个使用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的任何想法都将非常感激。

1 个答案:

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