gpt4 book ai didi

java - 使用类名而不是属性名来序列化属性

转载 作者:行者123 更新时间:2023-12-02 00:11:29 26 4
gpt4 key购买 nike

是否可以让 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 还具有需要使用其各自的类名作为元素名称进行序列化的父类(super class)型.

编辑

这是一个示例,我希望周围的元素成为实际的类名,即使具有继承:

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 属性注释将允许您拥有一个可以序列化为其他内容的方法 getFoobarhttps://mincong-h.github.io/2019/03/19/jackson-xml-mapper/

关于java - 使用类名而不是属性名来序列化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58117778/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com