Comment désérialiser oData JSON?

J’essaie d’utiliser le service Northwind OData:

http://services.odata.org/V3/OData/OData.svc/Products?$format=json

et le désérialiser dans une collection de produits:

using (var client = new HttpClient()) { HttpResponseMessage response = await client.GetAsync(new Uri(url)); ObservableCollection products = await response.Content.ReadAsAsync<ObservableCollection>(); } 

Mais le sérialiseur ne semble pas aimer la partie odata.metadata et le fait qu’il existe 2 enregistrements odata.type ( odata.type ne sais pas ce qu’ils sont).

Y a-t-il un moyen facile de faire ceci?

Utiliser Json.Net

 using (var client = new HttpClient()) { var json = await client.GetSsortingngAsync("http://services.odata.org/V3/OData/OData.svc/Products?$format=json"); var odata = JsonConvert.DeserializeObject(json); } 

 public class Value { [JsonProperty("odata.type")] public ssortingng Type { set; get; } public int ID { get; set; } public ssortingng Name { get; set; } public ssortingng Description { get; set; } public DateTime ReleaseDate { get; set; } public DateTime? DiscontinuedDate { get; set; } public int Rating { get; set; } public double Price { get; set; } } public class OData { [JsonProperty("odata.metadata")] public ssortingng Metadata { get; set; } public List Value { get; set; } } 

Définissez une classe pour la réponse de odata (c’est une définition générique pour pouvoir l’utiliser avec n’importe quel type):

 internal class ODataResponse { public List Value { get; set; } } 

Désérialiser comme ceci:

 using (var client = new HttpClient()) { HttpResponseMessage response = await client.GetAsync(new Uri(url)); var json = await response.Content.ReadAsSsortingngAsync(); var result = JsonConvert.DeserializeObject>(json); var products = result.Value; } 

Si vous utilisez Visual Studio, une fonctionnalité fantastique de génération de classes CLR est intégrée.

  1. Copier une charge OData dans votre presse-papiers
  2. Dans Visual Studio, sélectionnez l’option de menu Edition -> Collage spécial -> Coller JSON en tant que classes d’object.

Vous pouvez ensuite utiliser Json.NET pour désérialiser ces classes (comme décrit dans la réponse de LB).

Il existe un client .NET pour consumr directement des services OData. Pour le service V3 odata, vous pouvez essayer avec Simple.OData.Client , ODataLib pour OData v1-3 . Pour le service OData V3, vous pouvez essayer avec OData Client Code Generator . Pour les autres bibliothèques du client OData, vous pouvez vous référer à http://www.odata.org/libraries/ .

Un autre moyen possible de gérer le problème de désérialisation provoqué par la partie odata.metadata consiste à demander que la réponse odata ne contienne pas les métadonnées. Cela peut être fait avec un en-tête de requête par défaut dans le client http:

 client.DefaultRequestHeaders.Add("Accept", "application/json;odata.metadata=none"); 

Ce qui permet ensuite de désérialiser l’object avec ReadAsAsync:

 var products = response.Content.ReadAsAsync>>().Result["value"] 

Cela semble beaucoup plus simple que de devoir écrire une autre classe pour gérer la réponse. L’utilisation de .Result n’est peut-être pas la meilleure solution car le code n’est pas asynchrone à ce moment-là, mais ce n’était pas important dans mon application et le code occupait moins de lignes.