2016-06-13 2 views
0

Я пытаюсь выполнить некоторую полиморфную десарализацию JSON с использованием Jackson, однако список подклассов неизвестен во время компиляции, поэтому я не могу использовать аннотацию @JsonSubtype на базе класс. Вместо этого я хочу использовать класс TypeIdResolver для выполнения преобразования в значение свойства и из него.Jackon JSON: Полиморфная десарализация, когда подклассы неизвестны

Список возможных подклассов, с которыми я мог столкнуться, будет динамическим, но все они зарегистрированы во время выполнения с реестром. Поэтому мне кажется, что мой объект TypeIdResolver должен иметь ссылку на этот класс реестра. Он должен работать в том, что по сути является средой инъекции зависимостей (то есть я не могу иметь одноэлементный класс, с которым советуется TypeIdResolver), поэтому я думаю, что мне нужно ввести класс реестра в TypeIdResolver. Вид кода, который я думаю, Я хочу писать это:

ObjectMapper mapper = new ObjectMapper(); 
mapper.something(new MyTypeIdResolver(subclassRegistry)); 
mapper.readValue(...) 

Однако, я не могу найти способ сделать бит в середине. Единственные методы, которые я могу найти, используют аннотации java, чтобы указать, что будет TypeIdResolver.

Этот вопрос Is there a way to specify @JsonTypeIdResolver on mapper config instead of annotation? тот же, хотя мотивация отличается, и ответ заключается в использовании микширования аннотаций, который здесь не будет работать.

ответ

0

Обратите внимание, что в конце концов я отказался от Джексона и написал свою собственную гораздо более простую структуру, основанную на javax.json, которая только что сделала сериализацию, которую я хотел в гораздо более простой форме. Я имел дело только с простыми объектами DTO (data transfer object), поэтому было просто проще написать мою собственную простую структуру.

1

SimpleModule имеет способ registerSubtypes(), с помощью которого вы можете зарегистрировать подтипы. Если только прохождение Class es, простое имя класса используется как идентификатор типа, но вы также можете передать NamedType для определения идентификатора типа для использования для подкласса.

Итак, если вы действительно знаете полный набор, просто соберите SimpleModule, зарегистрируйте это для сопоставления.

В противном случае, если это не сработает, вам может потребоваться использовать данные только через статический экземпляр singleton (если применимо) или даже ThreadLocal.

Смежные вопросы