[Gson]MalformedJsonException 에러해결

백단 테스트 중 json을 받을 일이 있어서 그냥 작성했더니 아래와 같은 오류가 발생했다.

문제

  • jsp코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    let param = {};
    param.userid = 'testuser';
    param.json = '{\"title\":\"테스트제목\", \"detail\":\"테스트1의 설명입니다.\"}';

    $.ajax({
    url: "/test/json",
    method: "POST",
    data: param,
    callback: function(data){
    alert(JSON.stringify(data));
    }
    })
  • testVO코드

    1
    2
    3
    4
    5
    @Data
    public class TestVO {
    private String title;
    private String detail;
    }
  • 컨트롤러코드

    1
    2
    3
    4
    5
    6
    7
    8
    @RequestMapping(value="/test/json", method= RequestMethod.POST)
    @ResponseBody
    public TestVO testControl(@ResquestParam HashMap<String, String> param) throws Exception{
    TestVO test = new TestVO();
    test = new Gson().fromJson(param.get("json"), TestVO.class);

    return test;
    }
  • 에러메시지

    1
    com.google.gson.stream.MalformedJsonException: Expected ':' at line 1 column 8 path $.&quot

언제나 에러메시지 안에 답이 있다.




해결1: 공백, 특수문자 제거

com.google.gson.stream.MalformedJsonException - juno.log을 참고하면 특수문자를 제거하는 방법이 있다.
내 상황에선 json형태가 깨지기에 사용할 수 없었다.




해결2: setter 사용

jsp코드와 컨트롤러 코드를 수정했다.

  • jsp코드
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    let param = {};
    param.userid = "testuser";
    param.title = "테스트제목";
    param.detail = "테스트1의 설명입니다";

    $.ajax({
    url: "/test/json",
    method: "POST",
    data: param,
    callback: function(data){
    alert(JSON.stringify(data));
    }
    })
  • 컨트롤러코드
1
2
3
4
5
6
7
8
9
@RequestMapping(value="/test/json", method= RequestMethod.POST)
@ResponseBody
public TestVO testControl(@ResquestParam HashMap<String, String> param) throws Exception{
TestVO test = new TestVO();
test.setTitle(param.get("title"));
test.setDetail(param.get("detail"));

return test;
}

그냥 받았다… 더 좋은 방법이 있다면 댓글로 알려주시면 감사하겠습니다.