2017-08-20 1 views
0

J'ai besoin de désérialiser certains JSON dans mon objet où le boîtier du JSON est inconnu/incohérent. JSON.NET est censé être insensible à la casse mais cela ne fonctionne pas pour moi.JSON.NET Insensible à la casse La désérialisation ne fonctionne pas

Ma définition de la classe:

public class MyRootNode 
{ 
    public string Action {get;set;} 
    public MyData Data {get;set;} 
} 

public class MyData 
{ 
    public string Name {get;set;} 
} 

Le JSON je reçois a Action & Data en minuscules et a le boîtier correct pour MyRootNode.

J'utilise ce désérialiser:

MyRootNode ResponseObject = JsonConvert.DeserializeObject<MyRootnode>(JsonString); 

Il retourne à un initialisées MyRootNode mais les propriétés Action et Data sont nuls.

Des idées?

EDIT: Ajouté JSON

{ 
    "MyRootNode":{ 
     "action":"PACT", 
     "myData":{ 
     "name":"jimmy" 
     } 
    } 
} 
+1

Pouvez-vous poster le JSON? – Guy

+0

@Guy J'ai ajouté le JSON. – CathalMF

+0

La duplication possible de [JsonConvert ne désérialise pas correctement l'objet] (https://stackoverflow.com/questions/45384033/jsonconvert-does-not-deserialize-object-properly) – demo

Répondre

2

Vous devez ajouter une classe supplémentaire:

public class MyRootNodeWrapper 
{ 
    public MyRootNode MyRootNode {get;set;} 
} 

puis utilisez:

MyRootNodeWrapperResponseObject = JsonConvert.DeserializeObject<MyRootNodeWrapper>(JsonString); 

https://stackoverflow.com/a/45384366/34092 vaut peut-être lu. C'est fondamentalement le même scénario.

En outre, le changement:

public MyData Data {get;set;} 

à:

public MyData MyData {get;set;} 

selon les conseils de @demo et @Guy.

+0

Parfait. Merci. – CathalMF

+1

@ChathalMF Vous devriez aussi changer la propriété 'Data' en' MyData', 'public MyData MyData {get; ensemble; } '. – Guy

0

Ajoutez simplement JsonProperty attribut et définir le nom jsonProperty

public class MyRootNode 
{ 
    [JsonProperty(PropertyName = "action")] 
    public string Action {get;set;} 
    [JsonProperty(PropertyName = "myData")] 
    public MyData Data {get;set;} 
} 

public class MyData 
{ 
    [JsonProperty(PropertyName = "name")] 
    public string Name {get;set;} 
} 

UPD: et oui, ajoutez un certain type de base comme @mjwills suggèrent

+0

L'ajout de JsonProperty consiste à coder en dur le boîtier requis. Le fait est que les gens qui fournissent le JSON ne sont pas compatibles avec leur boîtier. Parfois, ils sont en majuscules, puis en minuscules, puis un mélange. Je déteste cette 3ème partie. haha – CathalMF

+0

Donc '[JsonProperty (PropertyName =" myData ")]' est la ligne clé ici @demo? Nice spotting BTW! – mjwills