본문 바로가기

개발 Error

응답에 \ 가 포함 에러

현재 ApiResponse 객체에 JSON 데이터를 문자열로 반환하고 있어서, 이때 문자열 내의 특수 문자(예: " 등)가 이스케이프 처리되어 \ 문자가 붙은 상태로 출력되고 있습니다.

 

이를 해결하기 위해서는 JSON 데이터를 파싱하여 객체로 변환한 후, 그 객체를 다시 JSON 문자열로 변환하여 반환하거나, 이스케이프 문자가 없는 형태로 바로 반환할 수 있도록 수정해야 합니다.

{
  "status": "success",
  "data": "{\"events\":[{\"id\":\"66d0baae4106f82fb1036f84_20221028T030000Z\",\"title\":\"일정 제목\",\"type\":\"USER\",\"calendar_id\":\"primary\",\"is_recur_event\":true,\"is_host\":true,\"time\":{\"start_at\":\"2022-10-28T03:00:00Z\",\"end_at\":\"2022-10-28T06:00:00Z\",\"time_zone\":\"Asia/Seoul\",\"all_day\":false,\"lunar\":false},\"color\":\"RED\"},{\"id\":\"66d0baae4106f82fb1036f84_20221029T030000Z\",\"title\":\"일정 제목\",\"type\":\"USER\",\"calendar_id\":\"primary\",\"is_recur_event\":true,\"is_host\":true,\"time\":{\"start_at\":\"2022-10-29T03:00:00Z\",\"end_at\":\"2022-10-29T06:00:00Z\",\"time_zone\":\"Asia/Seoul\",\"all_day\":false,\"lunar\":false},\"color\":\"RED\"},{\"id\":\"66d0ab2cb0c1f80cc89c4107_20221027T030000Z\",\"title\":\"27일만 있도록 수정 가능한가??\",\"type\":\"USER\",\"calendar_id\":\"primary\",\"is_recur_event\":true,\"is_host\":true,\"time\":{\"start_at\":\"2022-10-27T03:00:00Z\",\"end_at\":\"2022-10-27T06:00:00Z\",\"time_zone\":\"Asia/Seoul\",\"all_day\":false,\"lunar\":false},\"color\":\"RED\"},{\"id\":\"66d69947ff15e01682df6026_20221027T030000Z\",\"title\":\"일정 제목\",\"type\":\"USER\",\"calendar_id\":\"primary\",\"is_recur_event\":true,\"is_host\":true,\"time\":{\"start_at\":\"2022-10-27T03:00:00Z\",\"end_at\":\"2022-10-27T06:00:00Z\",\"time_zone\":\"Asia/Seoul\",\"all_day\":false,\"lunar\":false},\"color\":\"RED\"},{\"id\":\"66d69947ff15e01682df6026_20221028T030000Z\",\"title\":\"일정 제목\",\"type\":\"USER\",\"calendar_id\":\"primary\",\"is_recur_event\":true,\"is_host\":true,\"time\":{\"start_at\":\"2022-10-28T03:00:00Z\",\"end_at\":\"2022-10-28T06:00:00Z\",\"time_zone\":\"Asia/Seoul\",\"all_day\":false,\"lunar\":false},\"color\":\"RED\"},{\"id\":\"66d69947ff15e01682df6026_20221029T030000Z\",\"title\":\"일정 제목\",\"type\":\"USER\",\"calendar_id\":\"primary\",\"is_recur_event\":true,\"is_host\":true,\"time\":{\"start_at\":\"2022-10-29T03:00:00Z\",\"end_at\":\"2022-10-29T06:00:00Z\",\"time_zone\":\"Asia/Seoul\",\"all_day\":false,\"lunar\":false},\"color\":\"RED\"}],\"has_next\":false}",
  "message": "톡캘린더 목록 조회 되었습니다."
}

 

이 문제는 ApiResponse 객체가 데이터를 JSON으로 직렬화할 때 이스케이프 처리가 이루어지고 있기 때문일 수 있습니다. 이를 해결하기 위해 JSON 데이터를 ApiResponse의 data 필드에 String이 아닌 Map 또는 Object 형태로 저장해 보세요. 이렇게 하면 Jackson이 JSON 데이터를 이스케이프하지 않고 제대로 직렬화할 수 있습니다.

// JSON 문자열을 Map으로 변환하여 이스케이프 문자를 제거
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> responseData = objectMapper.readValue(response.getBody(), Map.class);

// Map을 그대로 반환하여 JSON 형태로 직렬화되도록 설정

코드 설명

  1. JSON 문자열을 Map<String, Object>로 변환:
    • ObjectMapper를 사용하여 response.getBody()에서 받은 JSON 문자열을 Map<String, Object>로 변환합니다. 이 과정에서 이스케이프 문자가 제거됩니다.
  2. 변환된 Map을 그대로 ApiResponse의 data 필드에 저장:
    • JSON 문자열을 다시 String으로 변환하지 않고, Map 객체 자체를 ApiResponse의 data 필드에 저장합니다. 이 경우 Jackson이 자동으로 객체를 직렬화하면서 이스케이프 문자가 없는 올바른 JSON 형식으로 반환할 것입니다.

이 방법을 사용하면 JSON 응답 내에 \ 문자가 더 이상 포함되지 않게 됩니다.