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



我有一个利用实体框架 4.1 的 ASP.NET WebApi 项目。 我正在尝试返回一个实体并利用 JSON.net 进行反序列化。 一切正常,但是当尝试使用 TimeSpan 属性反序列化实体时,我遇到了以下异常:

无法从 System.String 转换或转换为 System.TimeSpan。

查看堆栈跟踪显示:

Json序列化异常:转换值时出错 "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);
    }
}

用于在 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的想法将不胜感激。

解决方案是将 WebApi 项目配置为默认情况下在 global.asax Application_Start 事件中利用 JSON.net 进行序列化,如 http://blogs.msdn.com/b/henrikn/archive/2012/02/18/using-json-net-with-asp-net-web-api.aspx

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

相关内容

  • 没有找到相关文章

最新更新