Можно ли заставить Джексона и преобразователь 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>