java - 使用类名而不是属性名序列化属性
问题描述
是否可以让 Jackson 和 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>
编辑2:
这不可能是 Jackson 的工作方式,因此使用自定义序列化程序解决了这个问题。
解决方案
在您的类上提供 XML 属性注释将允许您拥有一个getFoobar
被序列化为其他东西的方法。https://mincong-h.github.io/2019/03/19/jackson-xml-mapper/
推荐阅读
- javascript - 在jsp中应用引导切换(折叠)
- database - MongoDB数据库设计:如何按客户分离数据?
- vb.net - 如何在没有替换功能的情况下替换字符串?
- javascript - 如何将反应儿童渲染为
而不是 {children} - websocket - nestjs + socket.io 在嵌套路径而不是主机的根目录中从微服务提供 websockets 总是返回 404 Not Found
- java - 在activiti 6中表达使用的未知方法
- python - 如何提取一个txt的数字并传递给一个数组
- azure - ARM 模板部署 - 由于与并发请求错误冲突,请求失败
- xamarin.forms - 如何在 shell 中为我的页面创建验证流程?
- javascript - 在 React 中的 mediaDevice 更改后更新组件