【问题标题】:Use restTemplate getForObject when a json property name changes depending on the request当 json 属性名称根据请求更改时使用 restTemplate getForObject
【发布时间】:2020-01-18 05:36:55
【问题描述】:

我想使用 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);

【问题讨论】:

    标签: java json spring-boot resttemplate


    【解决方案1】:

    您可以使用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);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2019-12-10
      • 2019-05-09
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多