使用jackson对象Map器和spring oauth2resttemplate

2nc8po8w  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(453)

我有以下形式的api响应:

{
    "data": [
        {
            "field1": "string_1",
            "field2": 2,
            "field3": "string_3",
            "field4": "string_4"
        }
    ]
}

也可以为空:

{
    "data": []
}

我以以下方式调用api:

apiResponse = oAuth2RestTemplate.exchange(theURL, HttpMethod.GET, requestEntity, APIResponse.class);

我无法控制配置 oAuth2RestTemplate ,但我可以定义 APIResponse 班级。我应该如何定义它,使上面的行不返回以下异常:

org.springframework.http.converter.HttpMessageConversionException: Type definition error: ... cannot deserialize from Object value (no delegate- or property-based Creator)

到目前为止,我掌握的情况如下:

public class DataElements {
    private String field1;
    private int field2;
    private String field3;
    private String field4;

    // constructor and getters and setters
}

@JsonSerialize
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@JsonIgnoreProperties(ignoreUnknown = true)
public class APIResponse {

    List<DataElements> data;

    // constructor and getters and setters
}
7ajki6be

7ajki6be1#

正如jacksongithub上指定的那样,它不要求类具有默认构造函数,但是如果没有其他可用的构造函数,它将尝试使用它。
将默认构造函数添加到 APIResponse 初始化或指示jackson使用由您指定的另一个构造函数。这可以通过使用 @JsonCreator 然后用它的参数 @JsonProperty ,参见注解文档
所以你会得到这样的结果:

@JsonSerialize
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
@JsonIgnoreProperties(ignoreUnknown = true)
public class APIResponse {

    List<DataElements> data;

    @JsonCreator
    public APIResponse(@JsonProperty("data") List<DataElements> data) {
        this.data = data;
    }

    // getters and setters
}
wfsdck30

wfsdck302#

我不知道这是不是个好办法,也许你可以试试

ObjectMapper mapper = new ObjectMapper();

ResponseEntity<JSONObject> jsonResponse = oAuth2RestTemplate.exchange(theURL, HttpMethod.GET, requestEntity, JSONObject.class);
JSONObject response = mapper.convertValue(jsonResponse.getBody(), new TypeReference<JSONObject>(){});

相关问题