Gson 활용 중 만난 Expected BEGIN_OBJECT but was STRING

Yunny.Log ·2022년 6월 28일
1

Debugging

목록 보기
27/69
post-thumbnail
MemberDto(parentId=[211, 209], childId=[209, 208], devId=1262)
  • 이라는 친구를 Gson을 활용해 DevelopmentRequestDto 라는 dto 로 변환해서 활용하려고 했습니다.

  • 아래는 그 DevelopmentRequestDto DTO 코드입니다.


public class DevelopmentRequestDto {
    List<Long> parentId;
    List<Long> childId;
    Long devId;
}
  • BUT json 을 DevelopmentRequestDto 로 변환하는 과정에서 BEGIN_OBJECT but was STRING 라는 에러가 계속해서 발생했습니다.

  • 이 에러가 전하고자 하는 바는, 자신은 json 데이터를 기대했는데 " 로 시작하는, 즉 쌍따옴표로 시작하는 스트링이 들어왔다는 투정입니다.

  • 이 경우에는 두가지 원인이 있을 것입니다.

    • 1) 올바른 json 을 주었으나, 파싱한 결과 클래스형의 차이 등 객체로 바꾸려는 대상과 자료형 차이가 있을 때
      (ex) List<Integer> classNumber 로 dto 에 선언해놓고서는 주는 json에는 "classNumber" : [ "hi", "my" ] " 이런식으로 List<String> 과 같이 보내주는 경우
    • 2) 들어온 json 을 파싱했는데 invalid json 이라서 String으로 json을 인식
  • 저의 경우에는, 객체로 잘 맵핑했다고 생각했으나 Gson 측이 제가 보낸 json 데이터를 파싱해보니, 객체로 인식을 못했다고 합니다.

    즉 위의 데이터(MemberDto(parentId=[211, 209], childId=[209, 208], devId=1262))가 적절한 JSON 형식이 아닌 것이지요.

  • 그래서 json formatter 로 문제가 되는 문자열 (MemberDto(parentId=[211, 209], childId=[209, 208], devId=1262)) 을 돌려보니 invalid json이었습니다.

  • 그러니 이를 파싱하면서 객체로 인식을 못하고 단순 문자열로 인식했던 것입니다.

  • 때문에 기존의 json 데이터를 적절한 json 형식이 되도록 변환시켜주는 과정을 거친다면 에러가 해결이 됩니다.

< before >

MemberDto(parentId=[211, 209], childId=[209, 208], devId=1262)

< after >

{
   "parentId":[
      211,
      209
   ],
   "childId":[
      209,
      208
   ],
   "devId":1262
}
  • 1) "(" 를 "{" 로 변환
  • 2) 각 키 이름을 스트링으로 변환
  • 3) 맨 앞에 Dto라고 붙었던 아이 제거
        String json = 타겟.get문자열().replace("(", "{");
        json = json.replace(")", "}");
        json = json.replace("이름tDto", "");
        json = json.replace("parentId=", "\"parentId\":");
        json = json.replace("childId=", "\"childId\":");
        json = json.replace("devId=", "\"devId\":");
  • MemberDto(parentId=[211, 209], childId=[209, 208], devId=1262) 로 들어온 json을 replace 라는 친구를 통해 적절 json 형식으로 정제해주는 과정을 거친 후 Gson에 넣었더니 해결됐습니다.

0개의 댓글