programing

안심 - 응답 JSON을 목록으로 역직렬화

bestcode 2023. 2. 10. 21:58
반응형

안심 - 응답 JSON을 목록으로 역직렬화

나는 POJO가 있다.Artwork검색 중입니다.ListHTTP 응답 본문의 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

반응형