일단 공통 포멧이 있는 대표적인 Json 예제를 들자면
{"status":"0000","message":"is ok", "resultData":{"seq":"1", "name":"5dolstory"}}
{"status":"0000","message":"is ok", "resultData":{"target":"mobile", "type":"credit"}}
위와 같은 형태인 API라고 보면 된다.
field를 보면 status, message는 항상 같고 resultData의 value field만 변경되는 경우이다.
이때 어떻게 객체로 변화시킬 수 있을까?
public class NameRes {
private String status;
private String message;
private Name resultData;
}
public class Name{
private int seq;
private String name;
}
public class TargetRes {
private String status;
private String message;
private Target resultData;
}
public class Target {
private String target;
private String type;
}
위와 같이 NameRes, TargetRes에 각각 status, message value를 만들고 이걸 parse해도 문제는 없다.
(apiResult는 String 타입의 response이라고 생각하자)
NameRes nameRes = new Gson().fromJson(apiResult, NameRes.class);
TargetRes targetRes = new Gson().fromJson(apiResult, TargetRes.class);
만약 여기서 Target Class만 혹은 Name Class만 parse하려면 어떻게 해야 할까?
방법은 여러가지인데 요기선 TypeToken으로 하는 방법을 쓴다.
public class Res {
private String status;
private String message;
private JsonElement resultData;
}
public class Name {
private int seq;
private String name;
}
public class Target {
private String target;
private String type;
}
//이걸로 공통값을 뽑아서 status 검증을 하자.
Res res = new Gson().fromJson(apiResult, Res.class);
if(res.getStatus())
...
Type nameType = new TypeToken<>(){}.getType(); //결과가 list인 경우
List names = new Gson().fromJson(res.getResultData(), nameType);
위처럼 하면 좋은 점이 공통적인 res 검증코드하고 실제 필요한 객체를 구분해서 처리할 수 있고 Name 객체 안에는 Name class에 맞는 변수들만 들어가 있게 된다.
댓글 없음:
댓글 쓰기