Сериализация свойства с именем класса вместо имени свойства - PullRequest
0 голосов
/ 26 сентября 2019

Можно ли заставить Джексона и преобразователь XML сериализовать свойство, используя имя класса в качестве имени элемента вместо имени свойства?

Т.е. дано:

package com.example.sometest;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;

public class Test2 {
    public static void main(String[] args) throws JsonProcessingException {
        XmlMapper mapper = new XmlMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(new JaxbAnnotationModule());

        System.out.println(mapper.writeValueAsString(new A()));
    }
}

class A {
    public B getFoobar() {return new B();}
}

class B {
    public String getSomething() {return "something";}
}

результат:

<A>
  <foobar>
    <something>something</something>
  </foobar>
</A>

Вместо этого я хотел бы, чтобы выходные данные были:

<A>
  <B>
    <something>something</something>
  </B>
</A>

Очевидно, это должно относиться только к некоторым типам, или это также повлияет на строкуЭто не то, что нам нужно.

Это часть гораздо более крупного приложения, использующего xjc для генерации классов XML, и в данном конкретном случае B также имеет супертипы, которые необходимо сериализовать с их соответствующимиИмена классов также являются именами элементов.

Редактировать

Вот пример, где я хотел бы, чтобы окружающий элемент был фактическим именем класса, даже с наследованием:

public class Test2 {
    public static void main(String[] args) throws JsonProcessingException {
        XmlMapper mapper = new XmlMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
        mapper.registerModule(new JaxbAnnotationModule());

        System.out.println(mapper.writeValueAsString(new A(new C())));
    }
}

class A {
    private final B object;

    A(B object) {this.object = object;}

    public B getFoobar() {return object;}
}

class B {
    public String getSomething() {return "something";}
}

class C extends B {
    public String getSomething() {return "other thing";}
}

Это будет производить:

<A>
  <foobar>
    <something>other thing</something>
  </foobar>
</A>

Но должно производить:

<A>
  <C>
    <something>other thing</something>
  </C>
</A>

1 Ответ

0 голосов
/ 27 сентября 2019

Предоставление аннотации свойства XML для вашего класса позволит вам иметь метод getFoobar, который сериализуется во что-то другое.https://mincong -h.github.io / 2019/03/19 / ДЖЕКСОН-XML-картограф /

...