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支持这个类。 你可以在这看看这是怎么回事