2016-04-21 1 views
2

Je teste quelques appels api en C# et obtenir la réponse JSON suivante:JSON Deserialize avec le champ vide C#

{ 
    "message": "The request is invalid. Model validation failed.", 
    "validationErrors": { 
    "": { 
     "reasons": [ 
     "A customer must be added to the order before it can be placed." 
     ] 
    } 
    } 
} 

Je veux mapper cette réponse à une classe avec un désérialiseur JSON et je ne contrôle sur la façon dont la réponse est formée. Comment gérer ce champ vide dans validationErrors afin que je puisse toujours accéder à la liste des raisons dans mon objet?

Remarque: lorsque je l'ai exécuté via json2csharp, il a donné ce mappage pas trop utile pour ce champ dans la classe validationErrors.

public __invalid_type__ __invalid_name__ {get;set;} 

Répondre

3

Deserialize à un Dictionary<string, ValidationError>:

public class ValidationError 
{ 
    public List<string> reasons { get; set; } 
} 

public class RootObject 
{ 
    public string message { get; set; } 
    public Dictionary<string, ValidationError> validationErrors { get; set; } 
} 

Cela fonctionne hors-the-box avec et . Si vous utilisez DataContractJsonSerializer (identifié par ), vous devez définir DataContractJsonSerializer.UseSimpleDictionaryFormat = true (.Net 4.5 et versions ultérieures uniquement).

+0

A travaillé! Accéder à une valeur avec une clé vide n'est pas ma chose préférée dans le monde, mais les développeurs d'api sont en faute pour ça, pas pour vous. – allie

2

Si vous avez votre propre classe que vous essayez de deserealization, vous pouvez essayer d'utiliser Newtonsoft-Json pour configurer vos noms de propriété Json par JsonPropertyAttribute et mettez-vous:

public class YourModel 
{ 
    [JsonProperty(name = "") 
    public ValidationErrors { get; set; } 
} 

D'autres exemples ici - link

Vous pouvez également déseraliser votre propriété en tant que Dictionary<string, YourErrorObject> et utiliser le premier élément d'accès aux erreurs.