{
"rcode":"1000",
"rdesc":"요청 처리 성공",
"data":[
{
"msg_id":"X8yFQIXxmETUAc9",
"cmpg_id":"null",
"grp_id":"EuSFQIXxmETSNwr",
"rpt_code":"7900",
"rpt_desc":"중복된 수신번호 접수 차단",
"send_type":"S",
"accepted_time":"20220921181657",
"sent_time":"",
"rpt_time":""
},
{
"msg_id":"BHxFQIXxmETACCT",
"cmpg_id":"null",
"grp_id":"VxCFQIXxmESyO4t",
"rpt_code":"1000",
"rpt_desc":"전송 성공",
"send_type":"S",
"accepted_time":"20220921181655",
"sent_time":"20220921181655",
"rpt_time":"20220921181656"
},
{
"msg_id":"XX7FQIXxmETeCZ7",
"cmpg_id":"null",
"grp_id":"I7uFQIXxmETcOvB",
"rpt_code":"7900",
"rpt_desc":"중복된 수신번호 접수 차단",
"send_type":"S",
"accepted_time":"20220921181659",
"sent_time":"",
"rpt_time":""
}
]
}
API로 위의 데이터를 받아서 gson을 통해 사용하려고 하려는데, key가 전부 snake case로 되어 있었다.
key가 필드명이랑 같아야 객체에 셋팅이 되는데 나는 필드명을 죽어도 snake case로 만들기 싫었다.
public class SMSResponseDto {
// 결과 코드
private String rcode;
// 결과 메세지
private String rdesc;
// 메시지 발송 ID
private String msgId = "";
// 메시지발송에 대한 그룹 ID
private String grpId = "";
// 예약 ID(예약전송 시 사용)
private String cmpgId = "";
// 발송 결과 코드
private String rptCode;
// 발송 결과 내용
private String rptDesc;
}
이런 camel case로 바꿔서 셋팅되도록 할 수는 없을까?
그러기 위해서는 gson을 생성할 때, FieldNamingPolicy를 사용하면 된다.
String doc = "{\"rcode\":\"1000\",\"rdesc\":\"요청 처리 성공\",\"data\":[{\"msg_id\":\"X8yFQIXxmETUAc9\",\"cmpg_id\":\"null\",\"grp_id\":\"EuSFQIXxmETSNwr\",\"rpt_code\":\"7900\",\"rpt_desc\":\"중복된 수신번호 접수 차단\",\"send_type\":\"S\",\"accepted_time\":\"20220921181657\",\"sent_time\":\"\",\"rpt_time\":\"\"},{\"msg_id\":\"BHxFQIXxmETACCT\",\"cmpg_id\":\"null\",\"grp_id\":\"VxCFQIXxmESyO4t\",\"rpt_code\":\"1000\",\"rpt_desc\":\"전송 성공\",\"send_type\":\"S\",\"accepted_time\":\"20220921181655\",\"sent_time\":\"20220921181655\",\"rpt_time\":\"20220921181656\"},{\"msg_id\":\"XX7FQIXxmETeCZ7\",\"cmpg_id\":\"null\",\"grp_id\":\"I7uFQIXxmETcOvB\",\"rpt_code\":\"7900\",\"rpt_desc\":\"중복된 수신번호 접수 차단\",\"send_type\":\"S\",\"accepted_time\":\"20220921181659\",\"sent_time\":\"\",\"rpt_time\":\"\"}]}";
JsonParser parser = new JsonParser();
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
JsonObject obj = parser.parse(doc).getAsJsonObject();
JsonArray arr = obj.getAsJsonArray("data");
for (JsonElement ele : arr) {
JsonObject result = ele.getAsJsonObject();
SMSResponseDto responseDto = gson.fromJson(result, SMSResponseDto.class);
System.out.println(responseDto);
}
FieldNamingPolicy를 LOWER_CASE_WITH_UNDERSCORES로 셋팅하여 Gson 객체를 생성 후, 해당 Gson 객체를 이용하여 원하는 객체에 셋팅 시킬 수 있다.
Jackson을 이용하는 방법도 있는데, 이 방법이 더 깔끔하고 편한 것 같다.