com.faster xml .jackson.databind.ex c .UnrecognizedPropertyException: нераспознанное поле "__type" - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь понять, как сделать 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 файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...