2017-09-07 3 views
-1

J'ai un problème lors de l'écriture des classes pour désérialiser un fichier JSON.Obtention de champs vides lors de la désérialisation de JSON dans mes classes contenant des dictionnaires

Mes cours se présentent comme suit:

public class Button1 
{ 
    public string Caption = ""; 
    public Dictionary<string, Button1> Buttons; 
} 

public class ButtonsMenu 
{ 
    public Dictionary<string, Button1> Buttons; 
} 

et je suis en train de désérialiser cette JSON:

{ 
    "Buttons": { 
    "Activity": { 
     "btn1": { 
     "Caption": "Promeni sostojba" 
     }, 
     "btn2": { 
     "Caption": "Izvrsi nesto drugo" 
     } 
    }, 
    "Navigate": { 
     "btnA": { 
     "Caption": "Pojdi na druga forma" 
     }, 
     "btnB": { 
     "Caption": "Otvori nesto razlicno" 
     } 
    }, 
    "Print": { 
     "btnX1": { 
     "Caption": "Pecati nalog" 
     }, 
     "btnX2": { 
     "Caption": "Pecati report" 
     } 
    } 
    } 
} 

avec l'utilisation de Json.Net comme ceci:

var buttonDef = JsonConvert.DeserializeObject<ESB.Shared.DTO.ButtonsMenu>(formDefJson); 

Mon problème est quand j'essaye de désérialiser mon JSON, j'ai les trois articles Activity, Navigate et Print mais le champ Captions est vide partout. Pouvez-vous me dire s'il vous plaît ce que je manque dans mes cours?

+0

Pourquoi le configurez-vous comme chaîne vide par défaut? 'public string Caption =" "' – Niladri

+1

S'il n'a pas la valeur d'être une chaîne vide et non nulle –

+2

Vous avez deux niveaux ici, Activity est un autre dictionnaire, essayez de faire les boutons dans ButtonsMenu dans ceci: public Dictionary > Boutons; '. –

Répondre

0

classes d'utilisation

public class Btn1 
{ 
    public string Caption { get; set; } 
} 

public class Btn2 
{ 
    public string Caption { get; set; } 
} 

public class Activity 
{ 
    public Btn1 btn1 { get; set; } 
    public Btn2 btn2 { get; set; } 
} 

public class BtnA 
{ 
    public string Caption { get; set; } 
} 

public class BtnB 
{ 
    public string Caption { get; set; } 
} 

public class Navigate 
{ 
    public BtnA btnA { get; set; } 
    public BtnB btnB { get; set; } 
} 

public class BtnX1 
{ 
    public string Caption { get; set; } 
} 

public class BtnX2 
{ 
    public string Caption { get; set; } 
} 

public class Print 
{ 
    public BtnX1 btnX1 { get; set; } 
    public BtnX2 btnX2 { get; set; } 
} 

public class Buttons 
{ 
    public Activity Activity { get; set; } 
    public Navigate Navigate { get; set; } 
    public Print Print { get; set; } 
} 

public class RootObject 
{ 
    public Buttons Buttons { get; set; } 
} 

ou utiliser le service pour générer des classes http://json2csharp.com/ espoir je vous aider :)

Mise à jour: si vous voulez utiliser le dictionnaire essayer cette

public class Button1 
{ 
    public string Caption; 
    public Dictionary<string, Dictionary<string, Button1>> Buttons; 
} 

public class ButtonsMenu 
{ 
    public Dictionary<string, Dictionary<string, Button1>> Buttons; 
} 
+0

J'utilise le dictionnaire et ce sont des classes plus complexes, mais merci –

0

Il ne fonctionne pas car votre JSON ne correspond pas exactement à la structure de votre classe. Il y a deux façons de le réparer, soit changer vos classes ou changer le JSON.

Si vous voulez que le changement JSON pour le faire fonctionner avec vos classes existantes, alors vous avez besoin d'un niveau Buttons supplémentaire entourant les boutons intérieurs des objets comme celui-ci:

{ 
    "Buttons": { 
    "Activity": { 
     "Buttons": { 
     "btn1": { 
      "Caption": "Promeni sostojba" 
     }, 
     "btn2": { 
      "Caption": "Izvrsi nesto drugo" 
     } 
     } 
    }, 
    "Navigate": { 
     "Buttons": { 
     "btnA": { 
      "Caption": "Pojdi na druga forma" 
     }, 
     "btnB": { 
      "Caption": "Otvori nesto razlicno" 
     } 
     } 
    }, 
    "Print": { 
     "Buttons": { 
     "btnX1": { 
      "Caption": "Pecati nalog" 
     }, 
     "btnX2": { 
      "Caption": "Pecati report" 
     } 
     } 
    } 
    } 
} 

Fiddle: https://dotnetfiddle.net/vAWhUd

Si vous préférez modifier vos classes pour qu'elles correspondent au JSON dans votre question, puis vous devez changer le dictionnaire externe Buttons pour qu'il devienne un dictionnaire imbriqué:

public class ButtonsMenu 
{ 
    public Dictionary<string, Dictionary<string, Button1>> Buttons; 
} 

public class Button1 
{ 
    public string Caption = ""; 
} 

Fiddle: https://dotnetfiddle.net/1KbQoD