有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java jackson XML序列化:继承类的列表

我想序列化/反序列化这样的XML:

<Multi>
    <child-001>
        <name/>
        <value/>
    </child-001>
    <child-002>
        <name/>
        <value/>
    </child-002>
</Multi>

其中,child-001和child-002是从同一父级继承的类

public abstract class Parent {
    private String name;
}

@JacksonXmlRootElement(localName = "child-001")
public class Child001 extends Parent {
    private String value;
}

@JacksonXmlRootElement(localName = "child-002")
public class Child002 extends Parent {
    private String value;
}

封装类如下所示:

class Multi {
    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Parent> nodes = new ArrayList<>();
}

如果没有@JacksonXmlElementWrapper(useWrapping=false),我有:

<Multi>
  <nodes>
    <nodes>
      <name>name001</name>
      <value>value001</value>
    </nodes>
    <nodes>
      <name>name002</name>
      <value>value002</value>
    </nodes>
  </nodes>
</Multi>

根据我得到的注释:

<Multi>
  <nodes>
    <name>name001</name>
    <value>value001</value>
  </nodes>
  <nodes>
    <name>name002</name>
    <value>value002</value>
  </nodes>
</Multi>

这与我需要的非常接近,但仍然需要用“child-001”和“child-002”替换“nodes”

有人能告诉我哪里能找到解决办法吗?或者我应该使用JAXB而不是Jackson

谢谢


共 (1) 个答案

  1. # 1 楼答案

    通常,为了准确地表示示例XML文件,Multi类应该如下所示,这很好地工作:

    class Multi {
        @JacksonXmlProperty(localName = "child-001")
        private Child001 child001;
    
        @JacksonXmlProperty(localName = "child-002")
        private Child002 child002;
    }
    

    在代码中,您使用的是父类的List个对象,大概是因为您可能将任意数量的元素反序列化为Parent的子类?这是多态反序列化的一种情况,需要定义类型信息,例如

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT)
    @JsonSubTypes({
            @JsonSubTypes.Type(name = "child-001", value = Child001.class),
            @JsonSubTypes.Type(name = "child-002", value = Child002.class)
    })
    abstract class Parent {
        private String name;
    }
    

    不幸的是,由于(jackson 2.9.2)尚未解决issue,jackson希望每个元素都有一个包装器,例如

    <Multi>
      <nodes>
        <child-001>
          <name>n1</name>
          <value>v1</value>
        </child-001>
      </nodes>
      <nodes>
        <child-002>
          <name>n2</name>
          <value>v2</value>
        </child-002>
      </nodes>
    </Multi>
    
    <> P>直到解决这个问题,考虑第一个选项。如果有不希望序列化的字段,请将其保留为空