#android #json #jackson #gson #retrofit2
Вопрос:
У меня есть устаревший проект, в котором используются как десериализаторы Джексона, так и gson. Я хотел бы использовать retrofit для анализа данных из любого из них. Однако проблема заключается в том, что ни JacksonConverterFactory, ни GsonConverterFactory не возвращают значение null для преобразователя responseBodyConverter. Т. е. вот импл Джексона:
@Override public Converterlt;ResponseBody, ?gt; responseBodyConverter( Type type, Annotation[] annotations, Retrofit retrofit) { JavaType javaType = mapper.getTypeFactory().constructType(type); ObjectReader reader = mapper.readerFor(javaType); return new JacksonResponseBodyConverterlt;gt;(reader); }
Я хотел бы использовать Джексона в том случае, если я зарегистрировал десериализатор, т. Е.:
val module = SimpleModule() module.addDeserializer(User::class.java, UserDeserializer()) val objectMapper = ObjectMapper() objectMapper.registerModule(module) val converterFactory = JacksonConverterFactory.create(objectMapper)
Поэтому в этом случае, если пользователь десериализуется, используйте Джексона, в противном случае пропустите и посмотрите на следующую зарегистрированную фабрику конвертеров, в данном случае gson.
Я понимаю, что, поскольку JacksonConverterFactory никогда не возвращает значение null, так что фабрика конвертеров будет пропущена, мне нужно будет написать свой собственный интерфейс ConverterFactory. Я ищу способ в Джексоне взглянуть на модуль картографов и определить, есть ли десериализатор клиентов. Однако в документах и общедоступном API я, похоже, не могу найти зарегистрированные десериализаторы.
Правильно ли я поступаю в этом вопросе?
Комментарии:
1. gt; Однако в документах и общедоступном API я, похоже, не могу найти зарегистрированные десериализаторы. Скорее всего, потому что ни Джексон, ни Gson не были предназначены для сотрудничества с другими подобными библиотеками. Что вы могли бы сделать, так это реализовать пользовательский преобразователь тела ответа, который будет отправлять правильный заводской метод в зависимости от заданных типов входных данных. Похоже, что это в значительной степени выполнимо путем реализации шаблона компоновщика для построения определенных правил, над которыми будет работать диспетчер преобразования.
2. Должен быть способ с помощью API Джексона спросить, какие пользовательские десериализаторы были зарегистрированы для типа.
3. Это зависит от того, как вы интерпретируете способ запроса API. Я не эксперт в Джексоне, но для Gson нет способа задать его и получить либо
true
илиfalse
: такого API просто нет. Однако это может быть выведено из возвращаемых классов адаптеров типов. В Джексоне я видел, что есть метод «canDeserialize», который может указывать либо истину, либо ложь, но я не уверен, сработает ли он для вас, так как он возвращаетсяtrue
до и после регистрации модуля десериализации для меня.SimpleModule
имеет некоторые защищенные поля, к которым вы также можете получить доступ в расширяющемся классе.