Java 我应该如何配置Jackson以在列表项上使用@XmlRootElement生成XML
我有一个Java 我应该如何配置Jackson以在列表项上使用@XmlRootElement生成XML,java,xml,spring-mvc,jackson,jackson-dataformat-xml,Java,Xml,Spring Mvc,Jackson,Jackson Dataformat Xml,我有一个Spring MVC@RestController,它使用通用名称,而不是我用@XmlRootElement或@JacksonXmlRootElement配置的名称。我希望XML看起来像这样: <list> <foo> <name>John</name> </foo> </list> <foo> <name>John</name> </foo>
Spring MVC
@RestController
,它使用通用名称,而不是我用@XmlRootElement
或@JacksonXmlRootElement
配置的名称。我希望XML
看起来像这样:
<list>
<foo>
<name>John</name>
</foo>
</list>
<foo>
<name>John</name>
</foo>
请帮助我将jackson配置为以“list”标记包装输出列表,并将每个Foo对象包含在“Foo”标记中,而不是包含在“item”标记中。您应该创建一个包含Foo对象列表的类ListFoo:
@XmlRootElement(name="list")
@XmlAccessorType(XmlAccessType.FIELD)
public class ListFoo {
@XmlElement(name = "foo")
private List<Foo> listFoo;
// getters & setters
}
@XmlRootElement(name=“list”)
@XmlAccessorType(XmlAccessType.FIELD)
公共类ListFoo{
@xmlement(name=“foo”)
私人名单;
//接球手和接球手
}
使用该功能,您可以从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;
}
}
import com.fasterxml.jackson.databind.SerializationFeature;
导入com.fasterxml.jackson.dataformat.xml.XmlMapper;
导入com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.ThreadLocalRandom;
公共类XmlMapperApp{
公共静态void main(字符串[]args)引发异常{
XmlMapper XmlMapper=新的XmlMapper();
addMixIn(ArrayList.class,ArrayListMixIn.class);
enable(SerializationFeature.INDENT_输出);
列表项=新建ArrayList();
添加(新项());
添加(新项());
System.out.println(xmlMapper.writeValueAsString(items));
}
}
@JacksonXmlRootElement(localName=“list”)
接口ArrayListMixIn{
}
类项目{
私有字符串name=“random-”+ThreadLocalRandom.current().nextDouble();
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}
以上代码打印:
<list>
<item>
<name>random - 0.2256442724594785</name>
</item>
<item>
<name>random - 0.9958813192003821</name>
</item>
</list>
随机-0.2256442724594785
随机-0.9958813192003821
是的,这样可以。然而,在我的spring控制器中,我无法为JSON和XML实现单独的方法,因为我需要为XML创建这个包装类。这是最好的吗?混音也能帮助标记吗?@Timpery,不幸的是,它在课堂上是硬编码的。请看一下StartRotarray的方法。你们当然可以尝试覆盖它,但我看不到实现这一点的简单方法。也许最简单的方法是为列表实现自定义序列化程序,但它看起来也很复杂。@Timpery,另一个问题见示例:有趣的链接。我必须考虑哪一个更易于维护。我倾向于@tcharaf建议的包装纸。谢谢你的深思熟虑!
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>