java 如何使用更改名称的字段对通用JacksonPOJO建模?

uplii1fm  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(153)

我与一组API交互,它们都返回类似的响应:

{
    "common1": ...,
    "common2": ...,
    "common3": ...,
    "someList": [
        //polymorph objects here
    ]
}

目前,我有一个单独的POJO为这些响应中的每一个。但是,我想在一个共同的对象,因为我总是执行相同的行动与这样的对象,这使得大量的代码重复。
最初,我曾想过创建一个类似的Jackson类:

public class CommonClass<T> {
    @JsonProperty("common1")
    private final CommonType1 common1;
    @JsonProperty("common2")
    private final CommonType2 common2;
    @JsonProperty("common3")
    private final CommonType3 common3;
    @JsonProperty("someList")
    private final List<T> someList;

    //constructor and getters here
}

这将工作正常,除了一个问题:someList的Json名称也会改变,有时是someListA,有时是someListB......基本上它会根据它包含的类型而改变。
这使得不可能遵循这种方法(至少我认为是这样),因为我不能动态地更改POJO中JsonProperty()注解的值。
我知道我可以创建一个基类,然后创建该类的多个扩展,每个扩展具有不同的列表(不同的名称),但这不是我的理想解决方案,因为如果不向下转换到我正在处理的POJO的具体类型,我将无法使用公共getter来处理元素。
你对这个问题有什么想法/建议/方法吗?

q3qa4bjr

q3qa4bjr1#

如果名称的选项列表不是太长,可以使用JsonAlias
可用于定义属性的一个或多个替代名称的注解,在反序列化期间作为正式名称的替代名称接受。别名信息也在POJO自检期间公开,但在始终使用主名称的序列化期间无效。
示例:

public class CommonClass<T> {
    @JsonProperty("common1")
    private final CommonType1 common1;
    @JsonProperty("common2")
    private final CommonType2 common2;
    @JsonProperty("common3")
    private final CommonType3 common3;
    @JsonProperty("someList")//official name, used during serialization
    @JsonAlias({"someListA", "someListB"})//aliases used during deserialization, if the official name was not found
    private final List<T> someList;
}
yhived7q

yhived7q2#

最简单的方法是将其反序列化为Map<String, Object>,然后以相同的方式处理Map,除了在检索someList* 属性时,而不是查找特定的键(如someListASomeListB),只需搜索以"someList"前缀开头的键

相关问题