<!CDATA[[]]> 映射到 "" 而不是 null Jackson
<!CDATA[[]]> Mapping to "" instead of null Jackson
我有一个函数可以将 XML 从 Kafka 主题读取为字符串格式,然后我想将其转换为 JSON 对象。
示例XML:
<Example>
<Object>
<Member1><![CDATA[]]</Member1>
<Member2><![CDATA[someText]]</Member2>
</Object>
</Example>
然后我有 POJO Classes,例如:(使用 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 字符串映射到示例 class.
@Autowired ObjectMapper xmlMapper;
@Autowired
private MappingJackson2XmlHttpMessageConverter xmlConverter;
...
xmlMapper = xmlConverter.getObjectMapper();
Example example = xmlMapper.readValue(xmlString, Example.class);
这导致示例 Class 具有以下内容:
Example
-> object
-> member1 : ""
-> member2 : "someText"
我希望 member1 为 null,而不是空字符串。我怎样才能做到这一点?
您需要实现自己的 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;
}
我有一个函数可以将 XML 从 Kafka 主题读取为字符串格式,然后我想将其转换为 JSON 对象。
示例XML:
<Example>
<Object>
<Member1><![CDATA[]]</Member1>
<Member2><![CDATA[someText]]</Member2>
</Object>
</Example>
然后我有 POJO Classes,例如:(使用 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 字符串映射到示例 class.
@Autowired ObjectMapper xmlMapper;
@Autowired
private MappingJackson2XmlHttpMessageConverter xmlConverter;
...
xmlMapper = xmlConverter.getObjectMapper();
Example example = xmlMapper.readValue(xmlString, Example.class);
这导致示例 Class 具有以下内容:
Example
-> object
-> member1 : ""
-> member2 : "someText"
我希望 member1 为 null,而不是空字符串。我怎样才能做到这一点?
您需要实现自己的 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;
}