2016-04-21 15 views
2

Ich teste einige api Anrufe in C# und erhalte die folgenden JSON-Antwort:JSON Deserialize mit leerem Feld C#

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

Ich mag mit einem JSON Deserializer diese Antwort auf eine Klasse kartieren, und ich habe keine Kontrolle darüber, wie die Antwort gebildet wird. Wie gehe ich mit diesem leeren Feld in validationErrors um, damit ich immer noch auf die Liste der Gründe in meinem Objekt zugreifen kann?

Hinweis: Wenn ich es durch json2csharp lief es gab diese nicht allzu nützliche Zuordnung für dieses Feld innerhalb der ValidationErrors-Klasse.

public __invalid_type__ __invalid_name__ {get;set;} 

Antwort

3

Deserialize zu einem 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; } 
} 

Dies funktioniert out-of-the-box mit und . Wenn Sie DataContractJsonSerializer (markiert als ) verwenden, müssen Sie DataContractJsonSerializer.UseSimpleDictionaryFormat = true (nur .Net 4.5 und höher) festlegen.

+0

Arbeitete! Der Zugriff auf einen Wert mit einem leeren Schlüssel ist nicht mein Lieblingsding auf der Welt, aber dafür sind die API-Entwickler schuld, nicht Sie. – allie

2

Wenn Sie Ihre eigene Klasse haben, das Sie deserealization sind versuchen, können Sie versuchen Newtonsoft-Json zu benutzen, um Ihre Json Eigenschaftsnamen von JsonPropertyAttribute zu konfigurieren und legen Sie es mögen:

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

Weitere Beispiele hier - link

Oder Sie können Ihr Eigentum als Dictionary<string, YourErrorObject> desealisieren und den ersten Eintrag für den Zugriff auf Fehler verwenden.