【问题标题】:Losing type element when serializing object inside ArrayList to XML将 ArrayList 中的对象序列化为 XML 时丢失类型元素
【发布时间】:2013-08-04 22:17:28
【问题描述】:

我在使用 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

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

【问题讨论】:

标签: xml-serialization jackson json-deserialization fasterxml


【解决方案1】:

好的,几条笔记。首先,顾名思义,@JsonRootName 只影响用于 XML 文档根的名称。所以它不用于TestChild。其次,听起来您想对列表使用所谓的“未包装”输出,省略包含列表元素的属性的元素。这是可行的:

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

因为默认设置是使用包装器(这与 JAXB 不同,其中未包装是默认设置)。或者,如果您想全局更改此设置以假定未包装为默认值,您可以通过XmlModule 更改默认值:

JacksonXmlModule module = new JacksonXmlModule();
// to default to using "unwrapped" Lists:
module.setDefaultUseWrapper(false);
XmlMapper xmlMapper = new XmlMapper(module);

希望这会有所帮助!

【讨论】:

  • 感谢您的回复。我删除了@JsonRootName 注释,你是对的。我确实想保留容器元素。我正在研究类似于您在 XML here 中看到的内容。您在这里看到,元素“端点”和“格式”都包含在各自的元素中。
【解决方案2】:

我通过在变量声明上方使用以下注释来实现这一点:

  • @JacksonXmlElementWrapper(localName="[插入集合名称]")
  • @JacksonXmlProperty(localName="[插入集合元素名称]")

这是一个简单的 RTFM 案例,记录在 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多