gpt4 book ai didi

java - 使用 Jackson 反序列化带有重复嵌套标签的 xml

转载 作者:行者123 更新时间:2023-12-03 22:52:36 25 4
gpt4 key购买 nike

我正在尝试反序列化一些具有相同名称的嵌套属性的 xml,但每个属性的包装器名称都是唯一的。下面的示例 XML。

我试过切换包装器和属性名称,但似乎不起作用。

<response>
<string>
<item>Sample string.</item>
<item>Another sample string.</item>
</string>
<number>
<item>123123123</item>
<item>900912</item>
</number>
</response>

我正在尝试将上述 XML 反序列化为 List<String>List<Integer>变量。

最佳答案

我设法让它创建一对或包装器的 ArrayLists 作为内部类:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;

@JacksonXmlRootElement(localName="response")
public class ResponseObjectList implements Serializable {

@JacksonXmlProperty(localName = "string")
private StringArrayListContainer string;

@JacksonXmlProperty(localName = "number")
private IntegerArrayListContainer number;

public ResponseObjectList() {
super();
}

public ResponseObjectList(List<String> stringItems, List<Integer> intItems) {
super();
this.string = new StringArrayListContainer(stringItems);
this.number = new IntegerArrayListContainer(intItems);
}

public StringArrayListContainer getString() {
return string;
}

public void setString(StringArrayListContainer string) {
this.string = string;
}

public IntegerArrayListContainer getNumber() {
return number;
}

public void setNumber(IntegerArrayListContainer number) {
this.number = number;
}

public static class StringArrayListContainer extends ArrayListContainer<String>{

public StringArrayListContainer() {
super();
}

public StringArrayListContainer(List<String> item) {
super(item);
}

}

public static class IntegerArrayListContainer extends ArrayListContainer<Integer>{

public IntegerArrayListContainer() {
super();
}

public IntegerArrayListContainer(List<Integer> item) {
super(item);
}

}

public static class ArrayListContainer<T extends Serializable>{

@JacksonXmlElementWrapper(useWrapping=false)
@JacksonXmlProperty(localName="item")
private List<T> item;

public ArrayListContainer(List<T> item) {
super();
this.item = item;
}

public ArrayListContainer() {
super();
}

public List<T> getItem() {
return item;
}

public void setItem(List<T> item) {
this.item = item;
}

}

}

测试看起来不错:

@Test
public void test3() throws JsonProcessingException {
ResponseObjectList response = new ResponseObjectList(
Arrays.asList(new String[] {"Sample string.","Another sample string"}),
Arrays.asList(new Integer[] {123123123,900912})
);
XmlMapper xmlMapper = new XmlMapper();
String content = xmlMapper.writeValueAsString(response);
this.logger.debug("content: " + content);
// content: <response xmlns=""><string><item>Sample string.</item><item>Another sample string</item></string><number><item>123123123</item><item>900912</item></number></response>
}

@Test
public void test4() throws JsonParseException, JsonMappingException, IOException {
String xml =
"<response>"
+ "<string>"
+ "<item>Sample string.</item>"
+ "<item>Another sample string</item>"
+ "</string>"
+ "<number>"
+ "<item>123123123</item>"
+ "<item>900912</item>"
+ "</number>"
+ "</response>";

XmlMapper xmlMapper = new XmlMapper();
ResponseObjectList object = xmlMapper.readValue(xml, ResponseObjectList.class);
Assert.assertFalse(object.getString().getItem().isEmpty());
Assert.assertFalse(object.getNumber().getItem().isEmpty());
}

我在包装器和测试中都使用了 List 而不是 ArrayList

关于java - 使用 Jackson 反序列化带有重复嵌套标签的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58159420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com