【问题标题】:Deserializing TimeSpan using JSON.net and .net WebApi使用 JSON.net 和 .net WebApi 反序列化 TimeSpan
【发布时间】:2012-05-20 03:56:47
【问题描述】:

我有一个使用 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":"/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 的想法将不胜感激。

【问题讨论】:

  • 你能用 response.Content.ReadAsStringAsync().Result 的值更新你的问题吗?
  • 另外,由于您没有明确显示您的服务器 HttpConfiguration,我将假设您使用的是默认格式化程序。但是您想使用 Json.NET 反序列化响应。理想情况下,您将拥有一个 Json.NET 媒体类型格式化程序,并且将配置服务器以使用它并确保您的客户端在读取以下内容时使用它: response.Content.ReadAsAsync(new[] { new JsonNetFormatter() })。
  • 添加了来自 response.Content.ReadAsStringAsync().Result 的示例内容

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


【解决方案1】:

解决方案是将 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);

【讨论】:

  • 你接受了你自己的答案,这只是部分正确。您问题的真正答案在于我上面的评论。反序列化由客户端处理,而不是服务器。在这两种情况下,您都需要使用 Json.NET 格式化程序。客户端不受服务器配置的影响。
猜你喜欢
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多