Модернизация конвертерных заводов gson и jackson

#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 имеет некоторые защищенные поля, к которым вы также можете получить доступ в расширяющемся классе.