Десериализация интерфейсов с использованием Джексона, где реализация интерфейса указана в сериализованном объекте - PullRequest
0 голосов
/ 29 мая 2019

У меня есть следующий вид структуры (упрощенной, чтобы, надеюсь, прояснить проблему):

interface Settings {
    ...
}

interface Component {
    ...
}

class Container {
    Class<? extends Component> component;
    Settings settings;
}

@SettingsClass(MySettings.class)
class MyComponent implements Component{
    ...
}

class MySettings implements Settings{
    ...
}

Если я сериализую экземпляр Container, используя Джексона, я получаю JSON, который выглядит немного как:

{
    component: "my.package.MyComponent"
    settings: { ... }
}

Это именно то, что я хочу.

Но я не могу десериализовать этот JSON, потому что Джексон не знает, какую реализацию настроек использовать.Во время выполнения я могу получить аннотацию SettingsClass и определить, к какому классу следует десериализовать поле settings.

Есть ли способ заставить Джексона частично десериализовать JSON, а затем выполнить его десериализациюостальные (то есть settings), как только я смог осмотреть component и определить, какой класс Settings использовать?

1 Ответ

1 голос
/ 29 мая 2019

Не совсем.Я должен был сделать что-то подобное в последнее время.Я проанализировал JsonNode и проверил свойство вручную.

final JsonNode jsonRoot = new ObjectMapper().readTree(jsonString);
//...
Optional.ofNullable(jsonRoot.get("component")).map(JsonNode::textValue) ...

Затем сериализовало дерево в POJO.

new ObjectMapper().readerFor(theClass).readValue(jsonRoot)

Не удивительно, но экономит парсинг всей строки как минимум дважды.

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