Я не знаю ни одного автоматического способа выполнения десериализации, но одним из решений является использование парсера " duck typing " для вашего JSON.
Предположим следующее
class Human {
public Human(JSONObject jo) {
// Parse out common json elements
}
}
class Male {
private boolean hasMaleParts;
public Male(JSONObject jo) {
super(jo);
// Parse out male only parts
}
}
class Female {
private boolean hasFemaleParts;
public Female(JSONObject jo) {
super(jo);
// Parse out female only parts
}
}
С этими тремя классами, где-то в вашем коде доступа к сети, есть метод, который печатает ваш возвращенный JSON и возвращает соответствующий объект.
public Human typeJson(JSONObject jo) {
if(jo.hasBoolean(hasMaleParts))
return new Male(jo);
else if(jo.hasBoolean(hasFemaleParts))
return new Female(jo);
else
throw new RuntimeException("Unable to determine data type");
}
В этом примере hasMaleParts
и hasFemaleParts
- произвольные логические флаги, однако во многих случаях вы можете (более правильно) набрать его, используя идентифицирующие атрибуты. Итак, если вы пытаетесь различить Motorcycle
и Car
, вы можете проверить number_of_wheels
.