2012-05-11 1 views
3

У меня есть проект ASP.NET WebApi, который использует Entity Framework 4.1. Я пытаюсь вернуть сущность и использовать JSON.net для десериализации. Тем не менее, все работает хорошо, пытаясь десериализовать объекты с свойствами TimeSpan, которые я запускаю, за исключением следующего:Deserializing TimeSpan с использованием JSON.net и .net WebApi

Невозможно выполнить преобразование или преобразование из System.String в System.TimeSpan.

Глядя на трассировки стека показывает:

JsonSerializationException: Ошибка преобразования значения "PT17H9M43.1671969S" к типу 'System.TimeSpan'. Путь 'TimeIn', строка 1, позиция 890.

Выход из response.Content.ReadAsStringAsync().Result является:

{ "CreatedDate": "/ Дата (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 был бы весьма признателен.

+0

Вы можете обновить свой вопрос со значением response.Content .ReadAsStringAsync(). Результат? –

+0

Кроме того, поскольку вы явно не показываете свой сервер HttpConfiguration, я собираюсь предположить, что вы используете форматирование по умолчанию. Однако вы хотите десериализовать ответ, используя Json.NET. В идеале у вас должен быть форматер медиа-типа Json.NET, и он будет настраивать сервер для его использования и гарантировать, что ваш клиент использует его при чтении содержимого, например: response.Content.ReadAsAsync (новый [] {новый JsonNetFormatter()}) , –

+0

Добавлен пример содержимого из ответа.Content.ReadAsStringAsync(). Результат – Jakkwylde

ответ

1

Решение было в настройке WebAPI проекта использовать JSON.net для сериализации по умолчанию в global.asax Application_Start события как указано на 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); 
+2

Вы приняли свой собственный ответ, который является лишь частично правильным. Реальный ответ на ваш вопрос лежит в моем комментарии выше. Deserialization обрабатывается клиентом, а не сервером. Вы должны использовать форматировщик Json.NET в обоих случаях. Конфигурация сервера не зависит от клиентов. –

 Смежные вопросы

  • Нет связанных вопросов^_^