api를 만들다 보면
{
"code":"SUCCESS",
"message":"로그인 성공",
"data":
{
"access_token":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNjc0MzY2NTQ5LCJyb2xlcyI6WyJVU0VSIl19.p2eyHioWuSX_oQraHNQ4ukoEXMXFeUj1hiKD1TM_v-zfowNO1BL0nSzFUuaU1LhOd0N0qMqseW0he52IxVF-PQ",
"refresh_token":"eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxIiwiZXhwIjoxNjc2OTU1ODQ5fQ.cE1bSbMaeBZaUKBdwYf7u1KPsJ0XpszicWlWkVIQjabiPdQ_v9DUaUoj8SNNx4g2VKP_CnXVhDBokBxwhVaOjA"
}
}
다음과 같은 데이터 형식이 있는데 data는 Object로 선언되어 있어서 일정한 규칙이 정해져 있지 않다.
그래서 데이터를 파싱함에 있어서 objectMapper의 class가 정확히 정의되지 않을 경우가 많다.
public class Response<T> {
private ResponseCode code;
private String message;
private T data;
}
public class LoginMember {
private String accessToken;
private String refreshToken;
}
데이터의 구조를 살펴보면 다음과 같은 데이터를 Response<LoginMember>
의 형태이다.
그래서 파싱하기 위해
다음과 같이 class를 가져오려고 해도 가져올 수 없다. 또한 그냥 Response.class
로 선언해서 데이터를 받아올 경우 LinkedMap형태로 받아와서 맵에서 데이터를 뽑아써야한다.(귀찮으면 이렇게 해도 될지도...?)
Response<LoginMember> response = objectMapper.readValue(contentAsString, new TypeReference<Response<LoginMember>>() {});
하지만 이렇게 선언해주면 데이터를 이제 원하는 대로 뽑아서 사용할수 있게 된다!