programing

gson이 Malformed Json Exception을 슬로우하다

nicegoodjob 2023. 3. 6. 22:11
반응형

gson이 Malformed Json Exception을 슬로우하다

gson을 사용하여 json 문자열을 Java-Object로 변환하고 있습니다.result2의 값은 result1의 값과 동일합니다.(디버거에서 복사, 백슬래시 추가)

결과1을 변환하는 동안 다음 예외가 발생합니다.com.google.gson.JsonSyntaxException: com.google.gson.stream.Malformed Json Exception: 라인 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;
}

result1의 마지막에는 닫힘 뒤에 있는 디버거에서는 볼 수 없는 문자가 있는 것 같습니다.}성격.의 길이는 얼마입니까?result1result2주의하겠습니다.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);

최근의 경험으로 볼 때 파서는 잘못된 JSON 데이터를 허용하는 경우에도 기본적으로 매우 내성이 있습니다.

그러나 신뢰할 수 있는 RESTful API에서 취득한 특정 데이터의 경우 이 오류는 후행 공백으로 인해 발생할 수 있습니다.이 경우, 간단히 말하면trim데이터는 오류를 피할 수 있습니다.

String trimmed = result1.trim();

그리고나서gson.fromJson(trimmed, T)효과가 있을지도 모릅니다.확실히 이것은 특수한 케이스만을 대상으로 하고 있기 때문에 YMMV.

슬래시를 추가할 필요가 없는 디버거에서는 입력 필드가 특수 문자를 인식합니다.

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

언급URL : https://stackoverflow.com/questions/11484353/gson-throws-malformedjsonexception

반응형