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 데이터를 기대했는데 " 로 시작하는, 즉 쌍따옴표로 시작하는 스트링이 들어왔다는 투정입니다.
이 경우에는 두가지 원인이 있을 것입니다.
List<Integer> classNumber
로 dto 에 선언해놓고서는 주는 json에는 "classNumber" : [ "hi", "my" ] "
이런식으로 List<String>
과 같이 보내주는 경우저의 경우에는, 객체로 잘 맵핑했다고 생각했으나 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에 넣었더니 해결됐습니다.