У меня есть иерархия классов, подобная этой:
public static class BaseConfiguration {
}
public abstract class Base {
private BaseConfiguration configuration;
public String id;
public BaseConfiguration getConfiguration() { ... }
public void setConfiguration(BaseConfiguration configuration) { ... }
}
public class A extends Base {
public static class CustomConfigurationA extends BaseConfiguration {
String filename;
String encoding;
}
CustomConfigurationA getConfiguration() { ... }
}
class B extends Base {
public static class CustomConfigurationB extends BaseConfiguration {
/* ... */
}
CustomConfigurationB getConfiguration() { ... }
}
И входные данные json, подобные этой (которые я не могу изменить самостоятельно)
{
"id":"File1",
"configuration":{
"filename":"...",
"encoding":"UTF-8"
}
}
Я разбираю JSON в Java с помощью Jackson следующим образом
ObjectMapper mapper = new ObjectMapper();
value = mapper.readValue(in, nodeType);
Я хочу десериализовать классы A, B и другие из JSON с помощью JAVA/Jackson. В JSON нет (и не может быть) информации о типе, встроенной в JSON. Я не могу использовать аннотации на классы (они мне не принадлежат) и я (полагаю) не могу использовать миксины, так как существует потенциально произвольное количество классов, таких как A & B (а миксины не являются динамическими). Хорошо то, что код десериализации знает, какой правильный пользовательский класс использовать для десериализации (в принципе, есть известное отображение от класса к классу конфигурации), но я не знаю, как заставить Jackson распознать эту информацию при десериализации JSON.
Короче говоря: я хочу иметь возможность определять тип десериализации объекта конфигурации в зависимости от типа окружающего класса, устанавливая все необходимое в ObjectMapper. Как этого можно добиться?