안심 - 응답 JSON을 목록으로 역직렬화
나는 POJO가 있다.Artwork
검색 중입니다.List
HTTP 응답 본문의 RESTful Web Service에서 JSON 형식의 오브젝트.반품된 목록을 분석하는 REST Assured 기반 테스트를 작성하려고 합니다.코드는 다음과 같습니다.
Response response = get("/artwork");
List returnedArtworks = response.getBody().as(List.class)
문제는 반환된 JSON을 다음과 같이 해석하기 위해 Rest Assured를 받을 수 없다는 것입니다.List<Artwork>
그 대신, 저는List<LinkedHashMap>
지도는 적절한 구조를 가지고 있다. 즉, 잭슨이 지도할 수 있다.Artwork
오브젝트입니다만, 수동으로 매핑하는 것은 피하고 싶습니다.
단일 개체를 다음과 같이 매핑할 경우 모델의 JSON 매핑은 정상입니다.
Artwork returnedArtwork = response.getBody().as(Artwork.class);
정상적으로 동작합니다.
받을 수 있을까요?returnedArtworks
~하듯이List<Artwork>
?
다음과 같이 할 수 있습니다.
List<Artwork> returnedArtworks = Arrays.asList(response.getBody().as(Artwork[].class));
JSON을 오브젝트 배열로 역직렬화한 후(배열 또는 목록의 JSON 문자열 간에 차이가 없기 때문에) 배열을 목록으로 변환하는 것이 중요합니다.
이 솔루션은 버전 3.0.2(io.restured):
JsonPath jsonPath = RestAssured.given()
.when()
.get("/order")
.then()
.assertThat()
.statusCode(Response.Status.OK.getStatusCode())
.assertThat()
.extract().body().jsonPath();
List<Order> orders = jsonPath.getList("", Order.class);
이렇게 하면 다음과 같은 구조의 개체가 추출됩니다.
public class Order {
private String id;
public String getId(){
return id; }
public void setId(String id){
this.id = id;
}
}
지정된 json을 사용하는 경우:
[
{ "id" : "5" },
{ "id" : "6" }
]
구글의 Gson 라이브러리를 사용하면 쉽게 해석할 수 있습니다.List<Artwork>
. 아래 코드를 사용해 보십시오.
Gson gson = new Gson();
List<Artwork> returnedArtworks = gson.fromJson(jsonStr, new TypeToken<List<Artwork>>(){}.getType());
//* where jsonStr is the response string(Json) receiving from your Restful webservice
rest-assured는 다음 버전을 제공합니다.Class
질문에 사용되었습니다.
java.lang.reflect.Type type; //TODO defines the type.
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)
내 생각에 그 방법은...type
변수는 사용되는 serialization lib에 따라 달라집니다.
Purushotham의 답변에서 지적된 바와 같이 Gson을 사용한다면,TypeToken
사용할 수 있습니다.안심할 수 있는 곳에서 직접 사용하는 것이 좋습니다.
Type type = new TypeToken<List<Artwork>>(){}.getType();
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)
Jackson을 사용할 때 해결 방법은 다음과 같습니다.TypeFactory
(adoc, source) 어느 타입으로 디프로비케이션을 실시할지를 지시하려면 , 다음의 순서에 따릅니다.
Type type = TypeFactory.defaultInstance().constructCollectionLikeType(ArrayList.class, Artwork.class);
Response response = get("/artwork");
List<Artwork> returnedArtworks = response.getBody().as(type)
REST 3.0.2를 통해 어레이에 콘텐츠가 존재하는지 여부를 간단하게 확인할 수 있습니다.
when().get("/artwork").then().body("artworks", hasItem("some art");
//or check multiple values in array
when().get("/artwork").then().body("artworks", hasItems("some art", "other art");
이렇게 하면 JSON을 변환하여 응답 내용을 확인하는 더 많은 예를 나열함으로써 코드가 복잡해지는 것을 피할 수 있습니다.링크
언급URL : https://stackoverflow.com/questions/21725093/rest-assured-deserialize-response-json-as-listpojo
'programing' 카테고리의 다른 글
데이터를 요청 페이로드가 아닌 폼 데이터로 게시하려면 어떻게 해야 합니까? (0) | 2023.02.14 |
---|---|
componentWillReceiveProps 라이프 사이클 메서드를 사용하는 경우 (0) | 2023.02.14 |
Azure: MySQL in-app(미리보기)를 사용하는 Wordpress 데이터베이스의 기본 사용자/패스 위치는 어디입니까? (0) | 2023.02.10 |
onChange->setState에서 한 단계 늦게 응답합니다. (0) | 2023.02.10 |
송신하기 전에 연락처 폼7에 접속하는 방법 (0) | 2023.02.10 |