programing

gson에서 MalformedJsonException 발생

nasanasas 2020. 11. 11. 20:15
반응형

gson에서 MalformedJsonException 발생


gson사용하여 json 문자열을 Java-Object 로 변환하고 있습니다. 의 값 result2는 정확히의 값과 동일한 결과 1 . (디버거에서 복사 됨, 백 슬래시 추가됨)

result1을 변환하는 동안 다음 예외가 발생 합니다. com.google.gson.JsonSyntaxException : com.google.gson.stream.MalformedJsonException : 1 행 170 열에 EOF가 필요합니다.

result2 변환이 작동합니다.

json 문자열은 jsonlint.com에 따라 유효합니다.

public static Userinfo getUserinfo()
{
    String result1 = http.POST("https://www.bitstamp.net/api/balance/",
                                postdata, true);
    String result2 = "{\"btc_reserved\": \"0\", \"fee\": \"0.5000\", \"btc_available\": \"0.10000000\", \"usd_reserved\": \"0\", \"btc_balance\": \"0.10000000\", \"usd_balance\": \"30.00\", \"usd_available\": \"30.00\"}";
    Gson gson = new Gson();
    Userinfo userinfo1 = gson.fromJson(result1, Userinfo.class); //throws Exception
    Userinfo userinfo2 = gson.fromJson(result2, Userinfo.class); //works fine

    return userinfo1;
}
private class Userinfo {

    public Userinfo(){
    }

    public float usd_balance;
    public float btc_balance ;
    public float usd_reserved;
    public float btc_reserved;
    public float usd_available;
    public float btc_available;
    public float fee;
    public float last_update;
}

결과 1에는 닫는 }문자 다음에 오는 디버거에서 볼 수없는 문자가 끝에있는 것으로 생각 됩니다. 의 길이 무엇 result1비교는 result2? 나는 result2당신이 인용 한 것처럼 169 자라는 것을 주목할 것입니다 .

하지 공백있는 개체의 종료 후 추가 문자를있을 때 GSON는 특정 오류가 발생하고,이 공백 정의 매우 협소합니다 (JSON 사양이처럼) - 단지 \t, \n, \r공백으로, 공간의 수를. 특히 후행 NUL ( \0) 문자는 공백으로 간주되지 않으며이 오류가 발생 합니다.

끝에 추가 문자의 원인을 쉽게 파악하고 제거 할 수없는 경우 GSON에게 관대 모드로 구문 분석하도록 지시하는 방법이 있습니다.

Gson gson = new Gson();
JsonReader reader = new JsonReader(new StringReader(result1));
reader.setLenient(true);
Userinfo userinfo1 = gson.fromJson(reader, Userinfo.class);

내 최근 경험에서 JsonReader#setLenient기본적으로 파서는 잘못된 형식의 JSON 데이터를 허용하는 경우에도 매우 관대합니다.

그러나 신뢰할 수있는 RESTful API에서 검색된 특정 데이터의 경우이 오류는 후행 공백으로 인해 발생할 수 있습니다. 이러한 경우 trim데이터 만으로도 오류를 피할 수 있습니다.

String trimmed = result1.trim();

그런 다음 gson.fromJson(trimmed, T)예상대로 작동합니다.


디버거에서는 백 슬래시를 추가 할 필요가 없으며 입력 필드는 특수 문자를 이해합니다.

자바 코드에서는 특수 문자를 이스케이프해야합니다.

참고 URL : https://stackoverflow.com/questions/11484353/gson-throws-malformedjsonexception

반응형