java - 使用 Jackson 将多个 json 键反序列化到一个字段
问题描述
我正在调用一个返回 json 响应的 REST api,例如:
{
"data": {
"code": {
"code1": {
"name": "some-name",
"value": "0.25"
},
"code2": {
"name": "some-name2",
"value": "0.88"
},
"code3": {
"name": "some-name3",
"value": "0.00"
},
"code4": {
"name": "some-name4",
"value": "-0.11"
},
"code5": {
"name": "some-name5",
"value": "0.99"
}
}
}
}
我将其建模为以下 POJO(为清楚起见,我省略了Data
类):
@Data
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class Code {
@JsonAlias({"code1", "code2", "code3", "code4", "code5"})
private final CustomCode customCode;
}
如果“代码”下方只有一个对象,这可以正常工作。在上面的示例中,使用 code1 到 code5 CustomCode 将只有一个“codeX”对象 - 其中 X 是 1、2、3、4 或 5。
我知道我可以使用地图,但我想尽可能避免使用地图。我期待找到的是这样的:
@Data
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class Code {
@JsonAlias({"code1", "code2", "code3", "code4", "code5"})
private final List<CustomCode> customCodeList;
}
customCodeList
将每个 code1 到 code5 pojos 保存在哪里。所以我的问题是:Jackson 是否提供了一些注释/配置来让我们实现这一点?
解决方案
你可以@JsonAnySetter
这样使用:
public static class Code {
private final List<CustomCode> customCodeList = new ArrayList<>();
private static final Set<String> ALIASES = ImmutableSet.of("code1", "code2", "...");
@JsonAnySetter
private void set(String name, CustomCode value) {
if (ALIASES.contains(name)) {
customCodeList.add(value);
}
}
}
这种方法的一个缺点是,如果您的Code
对象可能带有未知字段,您可能需要更改 to 的第二个参数set
并Object
更仔细地解析它。
推荐阅读
- c# - 如何定义一个采用 List
和 List的方法 在 C# 中 - javascript - React Recompose:在 WithStateProps 中创建的方法不可访问
- eclipse - BIRT 报告/将两个数据集中的字段合并到一个动态文本框中
- javascript - 使用 Angular7/firebase 对数组中的数据进行排序
- google-vision - Google Vision Api 文本检测换行符
- android - 执行 Espresso 测试时更改语言环境
- sql-server - MS Access DNSless 连接到 MS SQL Server 用户 ID/通过失败
- r - ggplot 地图上的意外形状
- javascript - React 组件未连接到商店
- mariadb - MariaDB 中的 AUTO_INCREMENT 仅保存在内存中