У меня есть иерархия классов, похожая на эту:
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"
}
}
Я анализирую JSONJava с Джексоном вот так
ObjectMapper mapper = new ObjectMapper();
value = mapper.readValue(in, nodeType);
Я хочу десериализовать классы A, B и другие из JSON, используя JAVA / Jackson.В JSON нет информации о типах (и не может быть).Я не могу использовать аннотации к классам (я не являюсь их владельцем), и я (полагаю), я не могу использовать миксины, поскольку существует потенциально произвольное количество классов, таких как A & B (и миксины не являются динамическими).Хорошо, что код десериализации знает, какой правильный пользовательский класс использовать для десериализации (в основном, существует известное сопоставление класса с классом конфигурации), но я не знаю, как заставить Джексона распознавать эту информацию при десериализации JSON.
Вкратце: я хочу иметь возможность разрешать тип десериализации объекта конфигурации в зависимости от типа окружающего класса, устанавливая все, что необходимо для ObjectMapper.Как этого достичь?