簡體   English   中英

我應該如何配置Jackson使用列表項上的@XmlRootElement來生成XML

[英]How should I configure Jackson to produce XML using the @XmlRootElement on list items

我有一個Spring-MVC @RestController使用通用名稱,而不是使用@XmlRootElement@JacksonXmlRootElement配置的名稱。 我希望XML看起來像這樣:

<list>
  <foo>
    <name>John</name>
  </foo>
</list>

但我得到以下信息:

<ArrayList>
  <item>
    <name>John</name>
  </item>
</ArrayList>

正確編組單個實例如下所示:

<foo>
  <name>John</name>
</foo>

為了解決這個問題,我嘗試同時使用JacksonJAXB批注。 我還對Stack Overflow上其他人的解決方案,各種博客以及針對JacksonSpring-mvc報告的問題進行了廣泛的搜索。

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import org.junit.Test;    
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;

public class JacksonXmlTest {

    @XmlRootElement(name="foo")
    @XmlAccessorType(XmlAccessType.FIELD)
    public static class Foo {
        private String name;

        public Foo(String name) {
            setName(name);
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

    @Test
    public void understandListTest() throws JsonProcessingException {
        // This is a JUnit test.....
        List<Foo> fooList = new ArrayList<>();
        fooList.add(new Foo("John"));

        XmlMapper mapper = new XmlMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(new JaxbAnnotationModule());
        System.err.println(mapper.writeValueAsString(fooList));
        System.err.println();
        System.err.println(mapper.writeValueAsString(fooList.get(0)));
    }

}

請幫我配置傑克遜,以將列表包裝在“列表”標簽中,並使每個Foo對象包含在“ foo”標簽中,而不是在“ item”標簽中。

您應該創建一個包含Foo對象列表的ListFoo類:

@XmlRootElement(name="list")
@XmlAccessorType(XmlAccessType.FIELD)
public class ListFoo {

    @XmlElement(name = "foo")
    private List<Foo> listFoo;

    // getters & setters

 }

使用MixIn功能,可以從java.util.*ArrayList類和其他類定義名稱。

import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

public class XmlMapperApp {

    public static void main(String[] args) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.addMixIn(ArrayList.class, ArrayListMixIn.class);
        xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);

        List<Item> items = new ArrayList<>();
        items.add(new Item());
        items.add(new Item());
        System.out.println(xmlMapper.writeValueAsString(items));
    }
}

@JacksonXmlRootElement(localName = "list")
interface ArrayListMixIn {
}

class Item {

    private String name = "random - " + ThreadLocalRandom.current().nextDouble();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

上面的代碼打印:

<list>
  <item>
    <name>random - 0.2256442724594785</name>
  </item>
  <item>
    <name>random - 0.9958813192003821</name>
  </item>
</list>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM