본문 바로가기

카테고리 없음

[Gson] gson으로 JSON을 object로 바꿀 때, SnakeCase를 CamelCase로 변환하여 셋팅하는 법

{
    "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을 이용하는 방법도 있는데, 이 방법이 더 깔끔하고 편한 것 같다.