Ответ 1
Вы можете реализовать JsonDeserializer
и использовать его при разборе значения Json для экземпляра Java. Я попытаюсь показать его с кодом, который даст вам идею:
1) Определите свой собственный класс JsonDeserializer
, который создает другой экземпляр классов с помощью входящего свойства json value id:
class MyTypeModelDeserializer implements JsonDeserializer<MyBaseTypeModel> {
@Override
public MyBaseTypeModel deserialize(final JsonElement json, final Type typeOfT, final JsonDeserializationContext context)
throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
JsonElement jsonType = jsonObject.get("type");
String type = jsonType.getAsString();
MyBaseTypeModel typeModel = null;
if("type1".equals(type)) {
typeModel = new Type1Model();
} else if("type2".equals(type)) {
typeModel = new Type2Model();
}
// TODO : set properties of type model
return typeModel;
}
}
2) Определите базовый класс для вашего другого экземпляра Java-объектов:
class MyBaseTypeModel {
private String type;
// TODO : add other shared fields here
}
3) Определите ваш другой экземпляр классов объектов Java, которые расширяют ваш базовый класс:
class Type1Model extends MyBaseTypeModel {
// TODO: add specific fields for this class
}
class Type2Model extends MyBaseTypeModel {
// TODO: add specific fields for this class
}
4) Используйте эти классы при анализе значения json на bean:
GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(MyBaseTypeModel.class, new MyTypeModelDeserializer());
Gson gson = gsonBuilder.create();
MyBaseTypeModel myTypeModel = gson.fromJson(myJsonString, MyBaseTypeModel.class);
Я не могу проверить это прямо сейчас, но надеюсь, что вы поняли эту идею. Также эта ссылка будет очень полезна.