none
Parser un objet JSON dans une application Windows 8 RRS feed

  • Question

  • Bonjour à toutes et à tous,

    Je viens exposer un problème que j'ai rencontré lorsque je parse un objet JSON récupéré sur une API.

    Exemple de l'objet JSON :

    {"id":1,

    "name":"Basic",

    "description":"Plat,Boisson",

    "picture":"http:\/\/img15.hostingpics.net\/pics\/192567basic.png",

    "price":"3.50",

    "priceAdherant":"2.50",

    "priceAdherent":"2.50",

    "products":[1,2,14,17,18,20,22,23,25],

    "categories":{"1":{"maxProducts":1,"id":1,"name":"Plat","products":[1,2]},"2":{"maxProducts":1,"id":2,"name":"Boissons","products":[14,17,18,20,22,23,25]}},

    "enabled":true}

    Les classes que j'ai créées afin de manipuler l'objet :

    Menu :

        class Menu
        {
            //Attributes
            private int _Id;
            private string _Name;
            private string _Description;
            private string _Picture;
            private decimal _Price;
            private decimal _PriceAdherent;
            private List<int> _Products;
            private List<Category> _Categories;
            private bool _IsEnabled;
    
            .......
    

    et ma classe Category

        class Category
        {
            //Attributes
            private int _MaxProducts;
            private int _Id;
            private string _Name;
            private List<int> _Products;
         
            .....

    Et pour finir, la fonction qui permet de récupérer mon objet menu :

     static public async Task<Menu> GetMenuById(int pMenuId)
            {
                Menu menu;
    
                try
                {
                    HttpClient client = new HttpClient();
                    Task<string> getStringTask = client.GetStringAsync("http://food.bedelicious.fr/services/menu/get/" + pMenuId.ToString());
                    string urlContents = await getStringTask;
                    menu = JsonConvert.DeserializeObject<Menu>(urlContents);
                }
                catch (Exception)
                {
                    //When an web exception occurs
                    return null;
                }
                return menu;
            }

    Lorsque que je récupère l'objet, tous les attributs de Menu sont bien récupérés, mis à part "categories", qui reste désespérément vide. 

    C'est donc ce bout de JSON que je récupère pas :

    "categories":{"1":{"maxProducts":1,"id":1,"name":"Plat","products":[1,2]},"2":{"maxProducts":1,"id":2,"name":"Boissons","products":[14,17,18,20,22,23,25]}}

    Mon choix de faire une List<Category> ne fonctionne donc pas ? Que dois-je faire pour récupérer ces informations ?

    Merci beaucoup de votre aide,

    Cordialement

    vendredi 27 septembre 2013 02:13

Réponses

  • Voila qui devrait résoudre ton soucis je pense.

    public class Menu { 
    
    [JsonProperty("id")] 
    public int Id { get; set; }
    
    [JsonProperty("name")] 
    public string Name { get; set; }
    
    [JsonProperty("description")]
    public string Description { get; set; }
    
    [JsonProperty("picture")]
    public string Picture { get; set; }
    
    [JsonProperty("price")] 
    public string Price { get; set; }
    
    [JsonProperty("priceAdherant")]
    public string PriceAdherant { get; set; }
    
    [JsonProperty("products")] 
    public int[] Products { get; set; }
    
    [JsonProperty("categories")] 
    public Dictionary<int, Categories> Categories { get; set;}
    
    [JsonProperty("enabled")] public bool Enabled { get; set;}
     
    }


    • Modifié Nicolas Dumez vendredi 27 septembre 2013 17:53
    • Marqué comme réponse MacMah0n vendredi 27 septembre 2013 17:54
    vendredi 27 septembre 2013 17:51

Toutes les réponses

  • Bonjour,

    Avez-vous essayé de poser les attributs JsonProperty sur les propriétés ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    vendredi 27 septembre 2013 06:58
    Modérateur
  • J'ai essayé d'ajouter ces attributs mais il n'y a pas de conséquence hélas
    vendredi 27 septembre 2013 13:13
  • Normalement ça doit fonctionner.

    Pouvez-vous vérifier la classe  Menu sur le serveur aussi que sur le client (assurez-vous que vous utilisez la même  classe)?

    Cordialement, 

     

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.


    • Modifié Aurel Bera vendredi 27 septembre 2013 13:52
    vendredi 27 septembre 2013 13:51
  • Merci de vos réponses !

    Je n'ai pas accès coté serveur, j'ai juste accès au JSON.

    Est-ce que cela ne viendrais du fait de ces index 1: et 2: 

    "categories": {
                "1": {
                    "maxProducts": 1,
                    "id": 1,
                    "name": "Plat",
                    "products": [
                        1,
                        2
                    ]
                },
                "2": {
                    "maxProducts": 1,
                    "id": 2,
                    "name": "Boissons",
                    "products": [
                        14,
                        17,
                        18,
                        20,
                        22,
                        23,
                        25
                    ]
                }}

    Qui engendrerai l'incompatibilité avec une List<Category>


    • Modifié MacMah0n vendredi 27 septembre 2013 14:12
    vendredi 27 septembre 2013 14:12
  • Voila qui devrait résoudre ton soucis je pense.

    public class Menu { 
    
    [JsonProperty("id")] 
    public int Id { get; set; }
    
    [JsonProperty("name")] 
    public string Name { get; set; }
    
    [JsonProperty("description")]
    public string Description { get; set; }
    
    [JsonProperty("picture")]
    public string Picture { get; set; }
    
    [JsonProperty("price")] 
    public string Price { get; set; }
    
    [JsonProperty("priceAdherant")]
    public string PriceAdherant { get; set; }
    
    [JsonProperty("products")] 
    public int[] Products { get; set; }
    
    [JsonProperty("categories")] 
    public Dictionary<int, Categories> Categories { get; set;}
    
    [JsonProperty("enabled")] public bool Enabled { get; set;}
     
    }


    • Modifié Nicolas Dumez vendredi 27 septembre 2013 17:53
    • Marqué comme réponse MacMah0n vendredi 27 septembre 2013 17:54
    vendredi 27 septembre 2013 17:51
  • Merci beaucoup, en effet c'était pas une List mais un Dictionary !
    Problème résolu !
    vendredi 27 septembre 2013 17:55