Я пытаюсь понять, как сделать JSON десериализацию с использованием Джексона. Мой JSON выглядит следующим образом:
{
"__type": "base",
"__ConfigAType": "Sona",
"sonaString": "some test string",
"allRequiredSchemas": "[\"abc\"]",
"stepName": "GL1",
"preReq": []
}
Мои классы выглядят так:
public class Step {
private String stepName;
private List<Step> preReq;
private ModuleConfig moduleConfig;
}
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "__type")
@JsonSubTypes({
@JsonSubTypes.Type(value = BaseConfig.class, name = BaseConfig.TYPE)
})
public interface ModuleConfig {
}
public class BaseConfig implements ModuleConfig {
public static final String TYPE = "base";
}
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY)
@JsonTypeName(SonaConfig.TYPE)
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "__ConfigAType")
@JsonSubTypes({
@JsonSubTypes.Type(value = SonaConfig.class, name = SonaConfig.TYPE)
})
public abstract class ConfigA extends BaseConfig {
public static final String TYPE = "ConfigA";
private List<String> allRequiredSchemas;
abstract Boolean execute(String input);
abstract String getConfigAType();
}
public class SonaConfig extends ConfigA {
public static final String TYPE = "SONA";
private String sonaString;
@Override Boolean execute(String input) {
return true;
}
@Override String getConfigAType() {
return "Sona";
}
}
Когда я пытаюсь десериализовать JSON в класс шага, я получаю следующую ошибку : com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "__type"
Я анализирую его следующим образом:
Step x = new ObjectMapper().readerFor(Step.class).readValue(json);
Поскольку поле preReq будет содержать список объектов типа Step, в идеале я бы хотел, чтобы оно ссылалось на другое JSON blob вместо создания одного гиганта JSON. Следовательно, у меня есть класс типа BaseConfig, и я планирую иметь RefConfig, который может читать ссылки на другие JSON файлы.