【问题标题】:Adding attribute to XML using JACKSON from JSON input使用来自 JSON 输入的 JACKSON 向 XML 添加属性
【发布时间】:2018-07-24 22:34:51
【问题描述】:

这是我的 JSON

    {
      "field1": "value1",
      "field2": "value2",
      "field3": "value3",
      "field4": "value4",
      "field5": "value5"
    }

这是我要转换成的 XML:

<root>
    <element1>value1</element1>
    <element2>value2</element2>
    <element3 element4="value4" element5="value5">value3</element3>
</root>

所以基本上,我想将元素 4 和 5 作为元素 3 的属性。希望到目前为止我说得通。

这就是我解析 JSON 的 pojo 的样子

public class JSONMessage {

    Date timestamp;

    @JsonProperty("field1")
    @JacksonXmlProperty(localName = "element1")
    String element1;

    @JsonProperty("field2")
    @JacksonXmlProperty(localName = "element2")
    String element2;

    @JsonProperty("field3")
    @JacksonXmlProperty(localName = "element3")
    String element3;

    @JsonProperty("field4")
    @JacksonXmlProperty(localName = "element4")
    String element4;

    @JsonProperty("field5")
    @JacksonXmlProperty(localName = "element5")
    String element5;
}

这就是我将 JSON 解析为 XML 的 pojo 的样子

@JacksonXmlRootElement(localName = "linkFoundEvent")
public class XMLMessage {
    private Date element1;
    private String element1;
    private String element2;
    @JacksonXmlProperty(localName = "element3")
    private Element3 element3;

}

对于 Element3,我已经编写了这个类 -

public class Element3{
    @JacksonXmlText
    private String element3;
    @JacksonXmlProperty(localName = "element4", isAttribute = true)
    private String element4;
    @JacksonXmlProperty(localName = "element5", isAttribute = true)
    private String element5;
}

如何将 Element4 和 Element5 作为 Element4 的属性?请帮忙!提前非常感谢。

【问题讨论】:

    标签: java json xml jackson


    【解决方案1】:

    您不需要两个 POJO 类(一个用于 JSON,一个用于 XML)来实现从输入 json 到输出 xml 的转换(如果这就是您想要的),请查看下面的完整工作代码:

    import java.io.IOException;
    import com.fasterxml.jackson.annotation.JsonCreator;
    import com.fasterxml.jackson.annotation.JsonProperty;
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.dataformat.xml.XmlMapper;
    import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
    import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
    
    public class JsonXmlTransformation {
    
        public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
            System.out.println(jsonToXml());
        }
    
        /**
         * json to xml transformation 
         */
        public static String jsonToXml() throws JsonParseException, JsonMappingException, IOException{
            String json = "{\r\n      \"field1\": \"value1\",\r\n      \"field2\": \"value2\",\r\n      \"field3\": \"value3\",\r\n      \"field4\": \"value4\",\r\n      \"field5\": \"value5\"\r\n    }";
            return new XmlMapper().writeValueAsString(new ObjectMapper().readValue(json, Message.class));
        }
    }
    
    class Message {
    
        @JacksonXmlProperty(localName = "element1")
        String element1;
    
        @JacksonXmlProperty(localName = "element2")
        String element2;
    
        @JacksonXmlProperty(localName = "element3")
        Elements elements;
    
        @JsonCreator
        public Message(@JsonProperty("field1") String element1, @JsonProperty("field2") String element2,
                @JsonProperty("field3") String element3, @JsonProperty("field4") String element4, @JsonProperty("field5") String element5) {
            super();
            this.element1 = element1;
            this.element2 = element2;
            this.elements = new Elements(element3, element4, element5); 
        }
    }
    
    class Elements{
    
        public Elements(String element3, String element4, String element5) {
            super();
            this.element3 = element3;
            this.element4 = element4;
            this.element5 = element5;
        }
    
        @JacksonXmlText
        String element3;
    
        @JacksonXmlProperty(localName = "element4", isAttribute = true)
        String element4;
    
        @JacksonXmlProperty(localName = "element5", isAttribute = true)
        String element5;
    }
    

    输入:

    {
          "field1": "value1",
          "field2": "value2",
          "field3": "value3",
          "field4": "value4",
          "field5": "value5"
        }
    

    输出:

    <Message>
        <element1>value1</element1>
        <element2>value2</element2>
        <element3 element4="value4" element5="value5">value3</element3>
    </Message>
    

    【讨论】:

    • 感谢您的回答,但它不起作用,我现在得到的输出是 等等..你说我不需要两个类,但您正在使用两个类,消息和元素。如果我严格遵循您的课程的开头和结尾,我看不出一个是子类。您在类中转换方法的这一行有点令人困惑,并且给了我 JsonParseException。你能简化一下吗?再次感谢您在这里提供帮助。
    • 我添加了独立的可执行代码,并修改了答案以使其更加简化。如果您仍有疑问,请告诉我。
    • 谢谢你,阿米特。我不得不改变一些事情,但它现在正在工作。 :)
    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 2016-03-01
    • 2013-05-09
    • 1970-01-01
    • 2022-08-18
    • 2018-06-09
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多