首页 > 解决方案 > 当 json 属性名称根据请求更改时使用 restTemplate getForObject

问题描述

我想使用 restTemplate.getForObject 方法,并且当所有请求的响应 JSON 键都相同时,我已经让它工作了。然后我使用了@JsonProperty 注释,一切正常。

但是现在我有一个响应,它始终具有相同的结构,但 JSON 密钥的名称之一会根据我正在执行的请求而更改。

例子

response 1:

{
  "entities": {
    "ID_1": { ... }
  }
}

response 2:

{
  "entities": {
    "ID_2": { ... }
  }
}

由于 ID_1 和 ID_2 的名称不同,我相信我不能使用 @JsonProperty 注释。

所以我的问题是我是否需要更改我正在使用的方法,或者我将如何创建映射到请求的 DataClass。我知道我可以手动将 JSON 响应映射到一个对象,但这感觉没有必要吗?

DataClass 结果 = restTemplate.getForObject(url, DataClass.class);

标签: javajsonspring-bootresttemplate

解决方案


您可以使用JsonAnySetter JsonAnyGetter映射,在以下示例中,additionalProperties 收集所有“非映射”属性:

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Example {

    @JsonProperty("foo")
    private String foo;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();


    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

推荐阅读