gpt4 book ai didi

java - FasterXML 序列化,无需在 XML 中使用字段类型

转载 作者:太空宇宙 更新时间:2023-11-04 13:19:33 30 4
gpt4 key购买 nike

我正在尝试实现以下 XML:

<model>
<entry>
<key>A</key>
<value>1</value>
</entry>
<entry>
<key>B</key>
<value>2</value>
</entry>
</model>

我通过试验代码得到的最接近的 POJO 模型如下所示:

import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import static com.google.common.collect.Lists.newArrayList;
import java.util.ArrayList;
import java.util.List;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import org.junit.Test;

public class InsPersonFormTest {

@JsonRootName("model")
public static class Model extends ArrayList<Entry> {

public Model(List<Entry> entries) { super(entries); }

public List<Entry> getEntry() { return this; }
}

public static class Entry {

String key;
String value;

public Entry(String key, String value) {
this.key = key;
this.value = value;
}

public String getKey() { return key; }

public String getValue() { return value; }
}

@Test
public void shouldSendPostRequest() throws JsonProcessingException {
Model model = new Model(newArrayList(new Entry("A", "1"), new Entry("B", "2")));

ObjectMapper xmlMapper = new XmlMapper();
String xml = xmlMapper.writeValueAsString(model);

assertThat(xml, equalTo(
"<model>"
+ "<entry><key>A</key><value>1</value></entry>"
+ "<entry><key>B</key><value>2</value></entry>"
+ "</model>"));
}
}

但它给了我

预期:

"<model><entry><key>A</key><value>1</value></entry><entry><key>B</key><value>2</value></entry></model>"

但是:是

"<model><item><key>A</key><value>1</value></item><item><key>B</key><value>2</value></item></model>"

我该如何更改itementry或者使用最简单的POJO结构更合适Map<String, String>领域?

最佳答案

不要使您的 Model 类成为 ArrayList 的子类型。而是使用组合

public static class Model {
private ArrayList<Entry> entry;

public Model(List<Entry> entries) {
entry = entries; // or make a copy
}

@JacksonXmlElementWrapper(useWrapping = false)
public List<Entry> getEntry() {
return entry
}

}

ArrayList 是一个 List,Jackson 以托管方式处理 List

您需要添加 JacksonXmlElementWrapper,以便告诉 Jackson 不要包装生成的 XML。

然后您可以使用

@JacksonXmlRootElement(/* custom */)

注释Entry并添加XML节点的本地名称和命名空间值。

关于java - FasterXML 序列化,无需在 XML 中使用字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33218291/

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