#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;
}