我与一组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来处理元素。
你对这个问题有什么想法/建议/方法吗?
2条答案
按热度按时间q3qa4bjr1#
如果名称的选项列表不是太长,可以使用JsonAlias。
可用于定义属性的一个或多个替代名称的注解,在反序列化期间作为正式名称的替代名称接受。别名信息也在POJO自检期间公开,但在始终使用主名称的序列化期间无效。
示例:
yhived7q2#
最简单的方法是将其反序列化为
Map<String, Object>
,然后以相同的方式处理Map,除了在检索someList* 属性时,而不是查找特定的键(如someListA
或SomeListB
),只需搜索以"someList"
前缀开头的键