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