2012-05-11 6 views
3

J'ai un projet ASP.NET WebApi qui utilise Entity Framework 4.1. Je tente de retourner une entité et de tirer parti de JSON.net pour la désérialisation. Tout fonctionne bien mais lorsque vous tentez de désérialiser des entités avec des propriétés TimeSpan, je cours l'exception suivante:Désérialisation de TimeSpan à l'aide de JSON.net et .net WebApi

Impossible de convertir ou de convertir System.String en System.TimeSpan.

Au vu de la trace de pile révèle:

JsonSerializationException: Erreur de conversion de valeur "PT17H9M43.1671969S" de type 'System.TimeSpan. Chemin 'TimeIn', ligne 1, la position 890.

La sortie de response.Content.ReadAsStringAsync().Result est:

{ "CreatedDate": "/ Date (1329851383157-0500) /", "ServicerUserId": 6, "TimeIn": "PT17H9M43.1671969S", "TimeOut": "PT17H28M43.1671969S"}

Avant d'utiliser JSON.net j'ai réussi à désérialisée en utilisant System.Runtime.Serialization.JsonDataContractJsonSerializer mais préféreraient ne pas utiliser cette approche.

code utilisé pour obtenir de l'entité 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); 
    } 
} 

Code utilisé dans le contrôleur de WebAPI retourner entité:

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

Toutes les idées sur la façon de désérialiser TimeSpan de serait grandement apprécié.

+0

Pouvez-vous mettre à jour votre question avec la valeur de response.Content .ReadAsStringAsync(). Résultat? –

+0

En outre, puisque vous ne montrez pas explicitement votre HttpConfiguration du serveur, je vais supposer que vous utilisez les formateurs par défaut. Pourtant, vous voulez désérialiser la réponse en utilisant Json.NET. Idéalement, vous auriez un formateur de type de support Json.NET et configureriez le serveur pour l'utiliser et vous assurer que votre client l'utilise lors de la lecture de contenu comme: response.Content.ReadAsAsync (new [] {new JsonNetFormatter()}) . –

+0

Ajout d'un exemple de contenu provenant de response.Content.ReadAsStringAsync(). Résultat – Jakkwylde

Répondre

1

La solution est dans la configuration du projet WebAPI pour tirer parti JSON.net pour la sérialisation par défaut en cas global.asax Application_Start comme cité en référence 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

Vous avez accepté votre propre réponse, qui n'est que partiellement correcte. La vraie réponse à votre question réside dans mon commentaire ci-dessus. La désérialisation est gérée par le client et non par le serveur. Vous devez utiliser le formateur Json.NET dans les deux cas. Les clients ne sont pas affectés par la configuration du serveur. –

Questions connexes