我应该如何配置 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>
为了尝试解决这个问题,我尝试同时使用 Jackson
和 JAXB
注释。我还在 Stack Overflow、各种博客以及针对 Jackson
和 Spring-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)));
}
}
请帮我配置 jackson 以输出包含在 "list" 标签中的列表,并将每个 Foo 对象包含在 "foo" 标签而不是 "item" 标签中。
您应该创建一个包含 Foo 对象列表的 class ListFoo:
@XmlRootElement(name="list")
@XmlAccessorType(XmlAccessType.FIELD)
public class ListFoo {
@XmlElement(name = "foo")
private List<Foo> listFoo;
// getters & setters
}
使用 MixIn 功能,您可以为 ArrayList
class 和 java.util.*
中的其他人定义名称。
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>
我有一个 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>
为了尝试解决这个问题,我尝试同时使用 Jackson
和 JAXB
注释。我还在 Stack Overflow、各种博客以及针对 Jackson
和 Spring-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)));
}
}
请帮我配置 jackson 以输出包含在 "list" 标签中的列表,并将每个 Foo 对象包含在 "foo" 标签而不是 "item" 标签中。
您应该创建一个包含 Foo 对象列表的 class ListFoo:
@XmlRootElement(name="list")
@XmlAccessorType(XmlAccessType.FIELD)
public class ListFoo {
@XmlElement(name = "foo")
private List<Foo> listFoo;
// getters & setters
}
使用 MixIn 功能,您可以为 ArrayList
class 和 java.util.*
中的其他人定义名称。
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>