2017-08-10 4 views
-4

Je consomme une API qui retourne le JSON suivant:Deserialize JSON avec haut tableau et le premier objet sans nom

[ 
    { 
     "product": { 
      "id": 2, 
      "name": "Auto" 
     } 
    } 
] 

Alors, je suis en train de désérialiser cela en C# objet wihout succès.

J'avais essayé beaucoup de solutions de stackoverflow d'autres.

Voici ma tentative:

public class DomainMessageResponse : BaseResponseMessage 
{ 
    public Example data { get; set; } 
} 

public class Example 
{ 
    [JsonProperty("product")] 
    public Product product { get; set; } 
} 

public class Product 
{ 
    [JsonProperty("id")] 
    public int id { get; set; } 

    [JsonProperty("name")] 
    public string name { get; set; } 
} 

Le problème est que le JSON commence avec [] et notre méthode générique (que j'utiliser dans un cadre interne) n'a pas pu en raison avec elle. Je reçois l'exception suivante:

peut désérialiser le tableau JSON en cours (par exemple [1,2,3]) dans le type ....

Merci @EZI et @eocron pour valide solutions.

+0

Qu'avez-vous essayé? Connaissez-vous http://json2csharp.com? Utilisez-vous Json.Net? –

+1

Oh, vraiment? Pouvez-vous partager avec nous ces solutions, nous en saurons plus sur le problème. – eocron

+0

qui ne ressemble pas à un JSON valide ... et je ne sais pas si vous vouliez dire un tableau JSON ou quoi? – Rahul

Répondre

1

Vous devriez désérialiser en tableau/liste. Le code ci-dessous devrait fonctionner ...

var list = JsonConvert.DeserializeObject<List<Item>>(json); 

public class Product 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
} 

public class Item 
{ 
    public Product product { get; set; } 
} 
+0

ma conjecture .. OP signifiait probablement un 'Product []' à la place – Rahul

+0

Nice. Mais, dans mon entreprise, nous travaillons avec SOA et nous avons des frameworks, l'un d'eux est de faire des API externes et j'ai découvert que notre méthode n'est pas préparée pour fonctionner avec ce type de JSON (avec array en début). Donc, j'apprécie beaucoup votre réponse. C'est valide et ça marche très bien. Je le testerais avec un morceau de Json. –

1

Il existe deux solutions à votre problème, compte tenu de la façon dont vous voulez utiliser votre objet.

Le premier consiste simplement à créer DTO avec les mêmes champs. Lorsque vous devez le plein contrôle:

using System.Collections.Generic; 
using System.Runtime.Serialization; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization; 

namespace ConsoleTest 
{ 
    class Program 
    { 
     [DataContract] 
     public class Example 
     { 
      [DataMember] 
      public Product Product { get; set; } 
     } 

     [DataContract] 
     public class Product 
     { 
      [DataMember] 
      public int Id { get; set; } 
      [DataMember] 
      public string Name { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      var json = @" 
          [ 
           { 
            ""product"": { 
             ""id"": 2, 
             ""name"": ""Auto"" 
            } 
           } 
          ]"; 

      var obj = JsonConvert.DeserializeObject<List<Example>>(json, 
                 new JsonSerializerSettings 
                 { 
                  ContractResolver = new CamelCasePropertyNamesContractResolver() 
                 }); 
     } 
    } 
} 

Le deuxième utilisé lorsque vous voulez quelques champs de JSON et ne se soucient pas beaucoup sur tout le reste, et utilise le type dynamique. Facile à coder, facile à utiliser, semble plutôt bon, mais pas très sûr:

using System.Collections.Generic; 
using Newtonsoft.Json; 

namespace ConsoleTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var json = @" 
          [ 
           { 
            ""product"": { 
             ""id"": 2, 
             ""name"": ""Auto"" 
            } 
           } 
          ]"; 

      dynamic list = JsonConvert.DeserializeObject<List<dynamic>>(json); 
      var id = (int)list[0].product.id; 
     } 
    } 
} 
+0

Merci beaucoup eocron. Votre solution fonctionne très bien. J'ai demandé à notre architecte d'implémenter une solution à due avec JSON qui commence par []. –