如何解决在 Jackson 中使用变量名映射对象
我有以下 JSON:
{
"filebeat": {
"version": 2,"modified_date": "2021-01-15T14:02:41.103Z","policy": {
"phases": {
"hot": {
"min_age": "0ms","actions": {
"rollover": {
"max_size": "30gb","max_age": "1d"
}
}
},"delete": {
"min_age": "90d","actions": {
"wait_for_snapshot": {
"policy": "mainbackuppolicy"
}
}
}
}
}
},"ilm-history-ilm-policy": {
"version": 1,"modified_date": "2020-12-08T14:31:15.717Z","actions": {
"rollover": {
"max_size": "50gb","max_age": "30d"
}
}
},"actions": {
"delete": {
"delete_searchable_snapshot": true
}
}
}
}
}
},"kibana-event-log-policy": {
"version": 3,"modified_date": "2020-12-08T14:39:00.097Z","logs": {
"version": 1,"modified_date": "2020-12-08T14:31:15.227Z","max_age": "30d"
}
}
}
}
}
},"metricbeat": {
"version": 2,"modified_date": "2021-01-15T14:02:42.090Z","metrics": {
"version": 1,"modified_date": "2020-12-08T14:31:15.475Z","ml-size-based-ilm-policy": {
"version": 1,"modified_date": "2020-12-08T14:31:15.083Z","actions": {
"rollover": {
"max_size": "50gb"
}
}
}
}
}
},"slm-history-ilm-policy": {
"version": 1,"modified_date": "2020-12-08T14:31:15.585Z","synthetics": {
"version": 1,"modified_date": "2020-12-08T14:31:15.352Z","watch-history-ilm-policy": {
"version": 1,"modified_date": "2020-12-08T14:31:15.792Z","policy": {
"phases": {
"delete": {
"min_age": "7d","actions": {
"delete": {
"delete_searchable_snapshot": true
}
}
}
}
}
}
}
我不知道如何将这些 JSON 元素映射到相应的对象,因为它的名称是可变的,例如filebeat、ilm-history-ilm-policy 等
我创建了以下对象:
public class IndexLifeCycleManagement {
private IndexLifeCycleManagementPolicy indexLifeCycleManagementPolicy;
}
public class IndexLifeCycleManagementPolicy {
@JsonProperty("modified_date")
private String modifiedDate;
@JsonProperty("version")
private int version;
@JsonProperty("policy")
private Policy policy;
}
但我认为问题在于杰克逊无法将 filebeat 映射到 IndexLifecycleManagement-object
提前致谢 问候
解决方法
将 IndexLifeCycleManagementPolicy
的每个实例与其对应的 JSON 属性进行映射,如下所示:
class IndexLifeCycleManagementPolicy{
@JsonProperty("modified_date")
private String modifiedDate;
@JsonProperty("version")
private int version;
@JsonProperty("policy")
private Policy policy;
}
class IndexLifeCycleManagement{
@JsonProperty("ilm-history-ilm-policy")
public IndexLifeCycleManagementPolicy ilmHistoryIlmPolicy;
@JsonProperty("filebeat")
public IndexLifeCycleManagementPolicy filebeat;
// similarly for every other attribute at this level
}
编辑1:
您可以使用 IndexLifeCycleManagementPolicy
的 Map 并通过 JsonAnySetter
注释动态设置它们,如下所示:
class IndexLifeCycleManagement{
public Map<String,IndexLifeCycleManagementPolicy> getIndexLifeCycleManagementPolicyMap() {
return indexLifeCycleManagementPolicyMap;
}
@JsonAnySetter
public void setIndexLifeCycleManagementPolicyMap(String key,IndexLifeCycleManagementPolicy policy) {
indexLifeCycleManagementPolicyMap.put(key,policy);
}
Map<String,IndexLifeCycleManagementPolicy> indexLifeCycleManagementPolicyMap = new HashMap<>();
}
例如: key = "filebeat" and value = IndexLifeCycleManagementPolicy
实例。
然后,您可以使用 getter 来读取此 IndexLifeCycleManagementPolicy
实例的 Map。
它可以,您需要创建一个对象,该对象将包含名为 filebeat、ilm-history-ilm-policy 等类型为 IndexLifeCycleManagementPolicy 的字段。 示例:
类 YourJsonObject private IndexLifeCycleManagementPolicy ilm-history-ilm-policy; private IndexLifeCycleManagementPolicy fileBeat 等
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。