将Jackson json属性映射到相应的xml元素

时间:2015-10-19 07:42:40

标签: java json xml jackson

我正在使用Jackson objectMapper将JSON读取到JsonNode,然后我使用xmlMapper将其序列化为XML。

我想通过使用标记" @"解析JSON属性来设置XML属性值。任何帮助,将不胜感激。感谢。

示例JSON:

{
  "response" : {
    "label" : {
      "@data" : "someValue"
    }
  }
}

需要映射到XML:

<response>
  <label data="someValue" />
</response>

这就是我现在能得到的:

<response>
  <label>
     <@data>someValue</@data>
  </label>
</response>

CODE:

JsonNode root = objectMapper.readTree(JSON); 
xml = xmlMapper.writeValueAsString(root);

1 个答案:

答案 0 :(得分:1)

好吧,我找到了一个产生所需输出的解决方案。但是,我不确定这是否是一个最佳解决方案,从某种意义上说它需要自定义内部类来指定告诉映射器如何解析的注释。

import java.util.*;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

public class JSONTest
{
    @SuppressWarnings("unchecked")
    public static void main(String[] args)
    {
        try {
            String jsonInput = "{  \"response\" : {    \"label\" : {      \"@data\" : \"someValue\"    }  }}";

            ObjectMapper om = new ObjectMapper();
            TypeFactory tf = om.getTypeFactory();
            JavaType mapType = tf.constructMapType(HashMap.class, String.class, response.class);
            Map<String, response> map = (Map<String, response>)om.readValue(jsonInput, mapType);

            XmlMapper xmlMapper = new XmlMapper();
            String ss = xmlMapper.writeValueAsString(map.get("response"));
            System.out.println(ss);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static class response {
        public Label label;
    }

    public static class Label {
        @JsonProperty("@data")
        @JacksonXmlProperty(isAttribute = true)
        public String data;
    }
}

输出:

<response><label data="someValue"/></response>