Предположим, что у меня есть следующий класс модели:Как условно десериализовать объект JSON на основе другого свойства JSON?
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; }
}
и я десериализации следующий JSON в этом классе:
{
"name":"test1",
"id":"aa0832f0508bb580ce7f0506132c1c13",
"active":"1",
"type":"open",
"result":{
"property1":"buy",
"property2":"123.123",
"property3":"2016-07-16T23:00:00",
"property4":"768",
"property5":true
}
}
объект Результат может быть разным каждый раз (один из 6 моделей) и его тип зависит от свойства JSON type
.
Я создал пользовательские ActionResultConverter
(JsonConverter
аннотации выше Result
свойства Action
класса), которые должны быть в состоянии создать конкретныеresult
объекта на основе строки в свойстве type
JSON.
Моя проблема заключается в том, что я не знаю, как получить доступ к этому свойству из конвертера, потому что только часть result
10 всего JSON передается JsonReader
.
Любые идеи или помощь будут оценены.
Спасибо!
можно десериализации в класс, который соответствует структуре JSon, и использовать этот класс, чтобы выяснить, какой тип пользовательский класс, в котором вы хотите получить данные. Или используйте динамический. Ранчо из куриного бекона. –
Кроме того, ваше свойство 'type' является' open'. Ваше значение enum для 'open' равно 0. Строки для ints не очень хорошо конвертируются. Если вы deserialized в класс, который соответствует структуре json, а затем конвертируйте в свой класс конечной игры, это преобразование также может быть там, где вы конвертируете из строки в int (Enum). –
Кроме того, вы назвали ваше перечисление таким же, как и в популярном системном классе: https://msdn.microsoft.com/en-us/library/system.type(v=vs.110).aspx Вероятно, некоторые из которых поддерживают систему. –