jackson:不同的XML和JSON格式

在我的基于Apache wink的REST项目中,我们使用Jackson jax-rs提供程序来处理JSON和XML内容类型。 我们的响应对象包含HashMap 。 映射键包含空格,因此无法将其序列化为XML元素名称。 JSON序列化工作正常。

JSON格式:

 { "properties": { "abc": { "name": "abc", "type": "Double", "value": "2.0" }, "xyz": { "name": "xyz", "type": "Double", "value": "0.0" } } } 

期望的XML格式

     

我们如何使用Jackson jax-rs XML和JSON提供程序实现这一目标。 是否可以定义自定义jackson序列化程序并扩展jax-rs提供程序。 请建议最好的方法。

更改XML的一种方法是使用JAXB XmlAdapter 。 就像是

 public class PropertyAdapter extends XmlAdapter> { public static class AdaptedProperties { public ArrayList property = new ArrayList<>(); } @Override public HashMap unmarshal( PropertyAdapter.AdaptedProperties list) throws Exception { HashMap map = new HashMap<>(); for (PropertyObject prop: list.property) { map.put(prop.getName(), prop); } return map; } @Override public PropertyAdapter.AdaptedProperties marshal( HashMap map) throws Exception { ArrayList list = new ArrayList<>(map.values()); AdaptedProperties props = new AdaptedProperties(); props.property = list; return props; } } 

然后只需注释字段/属性

 @XmlRootElement public class DTO { private HashMap properties; @XmlJavaTypeAdapter(PropertyAdapter.class) public HashMap getProperties() { return properties; } // setter } 

这将是结果。 这不完全是你想要的,但我不知道如何在没有包装器的情况下获得它。

       

您还需要确保的一件事是,当您使用Jackson时,您没有使用配置了JAXB注释支持的提供程序。 如果您使用此提供程序,它将使用XmlAdapter ,您将获得一个JSON数组,而不是您目前拥有的对象/地图。 假设您正在使用此提供程序 ,它有一个JacksonJaxbJsonProvider和一个普通的JacksonJsonProvider 。 你想确保只注册后者。


编辑

哦,我忘了添加我用来测试的PropertyObject类看起来像这样

 @XmlRootElement public class PropertyObject { private String name; @XmlAttribute(name = "name") public String getName() { return name; } // There are `type` and `value` fields also, with corresponding // getters and setters, both using the `@XmlAttribute` } 

UPDATE

假设您确实需要JAXB注释支持Jackson JSON序列化。 你可以做的是配置你自己的ObjectMapper ,只需使用JAXB支持这个类。 你可以在这看看这是怎么回事