Angenommen, ich habe folgende Modellklasse:Wie wird das JSON-Objekt basierend auf einer anderen JSON-Eigenschaft bedingt deserialisiert?
public class Action
{
public enum Type
{
Open,
Close,
Remove,
Delete,
Reverse,
Alert,
ScaleInOut,
Nothing
}
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("active")]
[JsonConverter(typeof(IntToBoolConverter))]
public bool Active { get; set; }
[JsonProperty("type")]
[JsonConverter(typeof(ActionTypeConverter))]
public Type ActionType { get; set; }
[JsonProperty("result")]
[JsonConverter(typeof(ActionResultConverter))]
public ActionResult Result { get; set; }
}
und ich folgende JSON in diese Klasse deserialisieren möge:
{
"name":"test1",
"id":"aa0832f0508bb580ce7f0506132c1c13",
"active":"1",
"type":"open",
"result":{
"property1":"buy",
"property2":"123.123",
"property3":"2016-07-16T23:00:00",
"property4":"768",
"property5":true
}
}
Ergebnis Objekt kann jedes Mal anders sein (eines von 6 Modellen) und seine Art hängt von der JSON-Eigenschaft type
ab.
Ich habe benutzerdefinierte erstellt ActionResultConverter
(JsonConverter
Anmerkung oben Result
Eigenschaft Action
Klasse) in der Lage sein sollte spezifischeresult
Objekt basierend auf Zeichenfolge in type
Eigenschaft von JSON zu erstellen.
Mein Problem ist, dass ich nicht weiß, wie auf diese Eigenschaft von Konverter zugreifen, da nur der result
Teil des gesamten JSON an JsonReader
übergeben wird.
Irgendwelche Ideen oder Hilfe werden geschätzt.
Danke!
Sie könnten eine Klasse Deserialisieren in welche die json Struktur übereinstimmt, und verwenden Sie diese Klasse, um herauszufinden, welche Art von Benutzerdefinierte Klasse, in der die Daten enden sollen. Oder verwenden Sie dynamic. Hühner-Speck-Ranch. –
Außerdem ist Ihre Eigenschaft 'type' offen. Ihr Enum-Wert für "open" ist 0. Strings zu Ints konvertieren nicht sehr gut. Wenn Sie in eine Klasse deserialisiert haben, die der JSON-Struktur entspricht, und in Ihre Endspielklasse konvertieren, könnte diese Konvertierung auch die sein, bei der Sie von String in Int (Enum) konvertieren. –
Außerdem haben Sie Ihre enum die gleiche wie eine beliebte Systemklasse benannt: https://msdn.microsoft.com/en-us/library/system.type(v=vs.110).aspx Wird wahrscheinlich verwirrend sein einige, die das System pflegen. –