Сопоставление с «» вместо null Джексон

#java #jackson #mapping #pojo #xml-to-json

#java #джексон #сопоставление #pojo #преобразование xml в json

Вопрос:

У меня есть функция, которая считывает XML из темы Kafka в строковый формат, который я затем хочу преобразовать в объект JSON.

Пример XML:

 <Example>
  <Object>
    <Member1><![CDATA[]]</Member1>
    <Member2><![CDATA[someText]]</Member2>
  </Object>
</Example>
  

Затем у меня есть классы POJO, такие как: (с импортом аннотаций lombok getter / setter / toString и jackson)

 @Getter
@Setter
@ToString
@JacksonXMLRootElement(localName = "Example")
public class TXML {

  @JacksonXmlProperty(localName = "Object")
  private someObject object;
}
  
 @Getter
@Setter
@ToString
public class someObject {

  @JacksonXmlProperty(localName = "Member1")
  private String member1;

  @JacksomXmlProperty(localName = "Member2")
  private String member2;
}
  

Затем я использую MappingJackson2XmlHttpMessageConverter для получения средства сопоставления объектов и использую его для сопоставления строки XML с примером класса.

 @Autowired ObjectMapper xmlMapper;
@Autowired
private MappingJackson2XmlHttpMessageConverter xmlConverter;
...
xmlMapper = xmlConverter.getObjectMapper();
Example example = xmlMapper.readValue(xmlString, Example.class);
  

В результате получается пример класса со следующим:

 Example
-> object
    -> member1 : ""
    -> member2 : "someText"
  

Я хочу, чтобы member1 был null, а не пустой строкой. Как я могу это сделать?

Комментарии:

1. Вы пытались указать только member2 и исключить member1?

Ответ №1:

Вам необходимо реализовать свой собственный com.fasterxml.jackson.databind.util.Converter , который преобразует ваше значение после десериализации, но перед установкой в требуемую форму.

Пример реализации:

 class CDATAConverter implements Converter<String, String> {

    @Override
    public String convert(String value) {
        return (value == null || value.length() == 0) ? null : value;
    }

    @Override
    public JavaType getInputType(TypeFactory typeFactory) {
        return typeFactory.constructType(String.class);
    }

    @Override
    public JavaType getOutputType(TypeFactory typeFactory) {
        return typeFactory.constructType(String.class);
    }
}
  

И вам нужно указать Jackson , как его использовать:

 @Getter
@Setter
@ToString
class SomeObject {

    @JsonDeserialize(converter = CDATAConverter.class)
    @JacksonXmlProperty(localName = "Member1")
    private String member1;

    @JsonDeserialize(converter = CDATAConverter.class)
    @JacksonXmlProperty(localName = "Member2")
    private String member2;
}