2012-07-14 4 views
54

json 문자열을 Java 객체로 변환하려면 gson을 사용하고 있습니다. 결과 2의 값은 결과 1과 정확히 동일합니다. (디버거로부터 복사; Backslashs 첨가) 다음과 같은 예외가 변환 동안 발생되는 결과 1gson throw MalformedJsonException

: com.google.gson.JsonSyntaxException을 : com.google.gson.stream.MalformedJsonException : 기대 값 EOF를 행 1 열 (170)에

결과 2이 정상적으로 작동합니다.

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; 
} 

답변

84

나는 결과 1 당신이 폐쇄 } 문자를 따라 디버거에서 볼 수없는 그것의 끝에서 일부 문자가 의심을 탈출해야합니다. result1result2의 길이는 얼마입니까? 인용 한대로 result2에는 169자를 사용합니다. 공백없는 개체의 종료 후 추가 문자를있을 때

GSON는 특정 오류가 발생, 그것은 매우 좁게합니다 (JSON 사양이처럼) 공백 정의 - 전용 \t, \n, \r, 공간을 공백으로 간주하십시오. 특히, 후행 NUL (\0) 문자는 공백으로 간주되지 않으므로이 오류가 발생합니다 (). 기본적으로, 내 최근의 경험에서

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

고마워요! 내 HTTP 클래스는 json 문자열을 256 바이트 char 버퍼에 다운로드 한 다음 문자열 (result1)로 변환했습니다.그 때문에 결과 1의 길이는 169 대신 255입니다. – Non

+0

동일한 문제가있었습니다. 예외적 인 종류의 전체 EOF 일은 저를 던져줬고, 제 문제는 순수하고 단순하게 나빴던 JSON을 형성했습니다. – Kong

+2

동일한 문제가 있었지만 FileChannel을 통해 JSON을 얻었습니다. 나는 인코딩이 완벽하다는 것을 확신했다. 내가 한 일은 HDD의 파일에서 String red에 trim() 메서드를 호출하는 것이 었습니다.이 방법으로 문제가 해결되었습니다. –

3

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

는 자바 코드에서는 특수 문자

+0

디버거에서 result1의 값을 복사하고 나중에 백 슬래시를 추가하여 result2의 특수 문자를 이스케이프 처리합니다.) – Non

+0

json 문자열에 infront 또는 추가 된 공백 문자 또는 \ n \ r이있을 수 있습니까? 그것은 단순해야합니다 –

+0

result1.equals (result2)의 결과는 무엇입니까? –

16

JsonReader#setLenient을 : 당신은 쉽게 끝에 추가 문자 원인을 알아낼 그들을 제거 할 수없는 경우

또 다른 옵션은 관대 모드에서 구문 분석 GSON을 알리는 것입니다 JSON 데이터의 형식이 잘못되어 파서가 매우 관용적입니다.

신뢰할 수있는 RESTful API에서 검색 한 특정 데이터의 경우이 오류는 후행 공백으로 인해 발생할 수 있습니다. 예상대로

String trimmed = result1.trim(); 

그런 다음 gson.fromJson(trimmed, T) 작동합니다 : 이러한 경우, 단순히 trim 데이터 오류를 방지한다.

+0

안녕하세요 @ ryenus, 만약 내가 두 단어 사이에 공간 inbetween 그러면 어떻게해야합니까? – Qasim

+2

문자열 응답에 공백이 있으면 어떨까요? 이 경우 Tirmming은 좋지 않습니다. 데이터의 무결성을 잃을 것입니다. – AnixPasBesoin