首页 > 解决方案 > 映射到 "" 而不是 null Jackson

问题描述

我有一个函数可以将 Kafka 主题中的 XML 读取为字符串格式,然后我想将其转换为 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 为空,而不是空字符串。我怎样才能做到这一点?

标签: javajacksonmappingpojoxml-to-json

解决方案


您需要实现自己的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;
}

推荐阅读