【发布时间】: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