java - Jackson xml在序列化时忽略空对象

标签 java spring-mvc jackson

我想借助 Spring MVC ModelAttribute (Person) 和 Jackson 从 html 表单创建一个 xml。

形式:

....
<input name="name"/>
<input name="birthday"/>
<input name="address.street/>
<input name="address.city/>
....

POJO:

@JacksonXmlRootElement(localName = "person")
@JsonInclude(Include.NON_DEFAULT)
public class Person implements Serializable {
    @JsonIgnore
    private Long id;
    @JacksonXmlProperty(localName = "name")
    private String name;
    @JacksonXmlProperty(localName = "email")
    private String email;
    @JacksonXmlProperty(localName = "address")
    private Address address;
    private String birthday;

//getter and setter

}

@JsonInclude(Include.NON_EMPTY)
public class Address implements Serializable {
    private Long id;
    private String street;
    private String streetNumber;
    private String postalcode;
    private String city;

   //getter and setter
}

在 Controller 中创建 XML:

@RequestMapping("saveperson")
public String savePerson(@ModelAttribute final Person person, final ModelMap model) {
    final ObjectMapper xmlMapper = new XmlMapper();
    final String xml = xmlMapper.writeValueAsString(person);
    return "redirect:/listpersons";
}

输出 xml:

    <person>
        <name>John</name>
        <email>john@test.com</email>
        <address/>
    </person>

如何从 XML 中排除空对象?

我试图将 ModelAttribute 中的所有空字符串设置为 null:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}

但它不起作用。 我也试过 @JsonInclude(Include.NON_EMPTY) 和@JsonInclude(Include.NON_NULL) 但它始终在 XML 中包含空对象。

我的第二个问题是:当我想将地址列表绑定(bind)到 html 表单时。执行此操作的最佳方法是什么?

....
<input name="name"/>
<input name="birthday"/>
<input name="address1.street/>
<input name="address1.city/>
<input name="address2.street/>
<input name="address2.city/>
....

@JacksonXmlRootElement(localName = "person")
@JsonInclude(Include.NON_DEFAULT)
public class Person implements Serializable {
    @JsonIgnore
    private Long id;
    @JacksonXmlProperty(localName = "name")
    private String name;
    @JacksonXmlProperty(localName = "email")
    private String email;
    @JsonIgnore
    private Address address1;
    @JsonIgnore
    private Address address2;
//add address1 and address2 in the getter or dto for the ModelAttribute?
    @JacksonXmlElementWrapper(localName = "addresses")
    @JacksonXmlProperty(localName = "address")
    private List<Address> address;
    private String birthday;

//getter and setter

}

谢谢!

最佳答案

克里斯在这里!

我刚遇到这个问题,很高兴看到有人问了同样的问题,但很遗憾没有人回答。

经过修补,我找到了两个可能的解决方案来解决您的第一个问题,即不在 XML 输出中包含空值。

首先是在我的模型之上包含 @JsonInclude(JsonInclude.Include.NON_EMPTY)。所以对于你来说,在这种情况下,我怀疑这会起作用:

@JacksonXmlRootElement(localName = "person") 
@JsonInclude(JsonInclude.Include.NON_EMPTY) 
public class Person implements Serializable {
    @JsonIgnore 
    private Long id;
    @JacksonXmlProperty(localName = "name") 
    private String name;
    @JacksonXmlProperty(localName = "email") 
    private String email;
    @JacksonXmlProperty(localName = "address") 
    private Address address;
    private String birthday;

   //getter and setter 
}

这消除了您之前的 Include.NON_DEFAULT,我希望如果您走这条路,您也可以没有它。

其次,似乎还有一个我没有采用的替代解决方案,它会让我们像这样直接更改 XmlMapper:

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

我希望其中之一能有所帮助,迟了十个月。

关于java - Jackson xml在序列化时忽略空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38441941/

相关文章:

spring - 如何为 Spring SQS 定制 Jackson 序列化器

java - 如何追踪性能下降的原因?

Java 继承 - 请解释

java - 二维数组转单数组

java - 当应用程序启动时,在 spring 中初始化一个方法一次的最佳方法是什么?

java - 自定义权限评估器未被调用 : Spring security 3. 2

java - 没有@Autowired的依赖注入(inject)

java - 东方数据库。如何判断数据库是否在池中?

json - Spring 3.2 中 AJAX 的 PUT 方法不起作用

java - 无法使用 Java/Hibernate 反序列化 NativeQuery 中的 DateTime