Как сериализовать полиморфный список с именами типов элементов как именами элементов XML в Джексоне - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть список объектов с общим базовым классом.Я хочу сериализовать (и десериализовать) этот список так, чтобы каждый элемент списка сериализовался с его корневым элементом, равным имени типа, и не иметь обертывающего объекта вокруг элемента.

Я попытался использовать JsonTypeInfo с Id.Name и As.WRAPPER_OBJECT, который создает XML с правильными именами элементов, но (очевидно) с другим слоем XML-элементов (из самого списка).

package zm.study.xmlserialize.jackson;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

public class JacksonListTest4 {

  public static class L {
    public List<A> as = new ArrayList<>();
  }

  @JsonTypeInfo(use = Id.NAME, include=As.WRAPPER_OBJECT)
  @JsonSubTypes({
    @JsonSubTypes.Type(value=B.class, name="b"),
    @JsonSubTypes.Type(value=C.class, name="c"),
  })
  public static abstract class A {

  }

  public static class B extends A {

  }

  public static class C extends A {

  }

  @Test
  public void test() throws Exception
  {
    L l = new L();
    l.as.add(new B());
    l.as.add(new C());

    new XmlMapper().enable(SerializationFeature.INDENT_OUTPUT)
      .writeValue(System.out, l);

  }

}

Я хотел бы получить:

<L>
  <as>
      <b/>
      <c/>
  </as>
</L>

Вместо этого я получаю:

<L>
  <as>
    <as>
      <b/>
    </as>
    <as>
      <c/>
    </as>
  </as>
</L>

1 Ответ

0 голосов
/ 15 февраля 2019

Если вы знаете, как вы хотите, чтобы он выглядел так, вам лучше написать XSD , а затем использовать инструмент типа JAXB для создания объекта Java сериализации / десериализации.

...