gpt4 book ai didi

xml-serialization - 将 ArrayList 中的对象序列化为 XML 时丢失类型元素

转载 作者:行者123 更新时间:2023-12-05 01:07:49 25 4
gpt4 key购买 nike

我在使用 Jackson 序列化为 XML 时似乎遇到了问题。我的代码如下:

测试容器

package com.test;

import java.util.ArrayList;

import com.fasterxml.jackson.annotation.JsonProperty;

public class TestContainer {

private String testContainerID;
private String testContainerMessage;
private ArrayList<TestChild> testContainerChildren;

@JsonProperty("TestContainerID")
public String getTestContainerID() {
return testContainerID;
}

@JsonProperty("TestContainerID")
public void setTestContainerID(String testContainerID) {
this.testContainerID = testContainerID;
}

@JsonProperty("TestContainerMessage")
public String getTestContainerMessage() {
return testContainerMessage;
}

@JsonProperty("TestContainerMessage")
public void setTestContainerMessage(String testContainerMessage) {
this.testContainerMessage = testContainerMessage;
}

@JsonProperty("TestContainerChildren")
public ArrayList<TestChild> getTestContainerChildren() {
return testContainerChildren;
}

@JsonProperty("TestContainerChildren")
public void setTestContainerChildren(ArrayList<TestChild> testContainerChildren) {
this.testContainerChildren = testContainerChildren;
}

}

小童
package com.test;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonRootName;

@JsonRootName(value="TestChild")
public class TestChild {

private String testChildID;
private String testChildMessage;

@JsonProperty("TestChildID")
public String getTestChildID() {
return testChildID;
}

@JsonProperty("TestChildID")
public void setTestChildID(String testChildID) {
this.testChildID = testChildID;
}

@JsonProperty("TestChildMessage")
public String getTestChildMessage() {
return testChildMessage;
}

@JsonProperty("TestChildMessage")
public void setTestChildMessage(String testChildMessage) {
this.testChildMessage = testChildMessage;
}

}

使用
  • 序列化:

    XmlMapper xm = new XmlMapper();
    TestContainer tc = xm.readValue(sb.toString(), TestContainer.class);
  • 反序列化:

    System.out.println(xm.writeValueAsString(tc));
    tc = xm.readValue(sb.toString(), TestContainer.class);

  • 我正在做的是从类路径上的文件夹加载一个 XML 文件并将文件的内容放入 StringBuffer。问题是为对象集合生成的 XML。在编写 XML 时,我想要类似的东西:
    <TestContainerChildren><TestChild><...(Element Details)...></TestChild></TestContainerChildren>

    但我得到:
    <TestContainerChildren><TestContainerChildren><...(Element Details)...><TestContainerChildren></TestContainerChildren>

    我不确定我错过了什么,在这里。我对序列化/反序列化的 JSON 部分没有问题,只有 XML。我尝试使用 Jackson 和 JAXB 注释来关闭包装,我尝试使用以下注释:
  • @JsonRootName
  • @JsonProperty
  • @JacksonXmlElementWrapper
  • @JacksonElement
  • @XmlElementWrapper
  • @XmlElement

  • 我很确定这对我来说是愚蠢的,但任何帮助将不胜感激。

    最佳答案

    好的,有几个注意事项。一、@JsonRootName顾名思义,只影响用于 XML 文档根的名称。所以不用于TestChild .其次,听起来您想对列表使用所谓的“解包”输出,省略包含列表元素的属性的元素。这是可行的:

    @JacksonXmlElementWrapper(useWrapping=false)
    @JsonProperty("TestContainerChildren")
    public ArrayList<TestChild> getTestContainerChildren() { ... }

    因为默认设置是使用包装器(这与 JAXB 不同,其中 unwrapped 是默认设置)。或者,如果您想全局更改此设置以假定未包装为默认值,您可以通过 XmlModule 更改默认值。 :
    JacksonXmlModule module = new JacksonXmlModule();
    // to default to using "unwrapped" Lists:
    module.setDefaultUseWrapper(false);
    XmlMapper xmlMapper = new XmlMapper(module);

    希望这可以帮助!

    关于xml-serialization - 将 ArrayList 中的对象序列化为 XML 时丢失类型元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18037302/

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