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의 마지막에는 닫힘 뒤에 있는 디버거에서는 볼 수 없는 문자가 있는 것 같습니다.}성격.의 길이는 얼마입니까?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);
최근의 경험으로 볼 때 파서는 잘못된 JSON 데이터를 허용하는 경우에도 기본적으로 매우 내성이 있습니다.
그러나 신뢰할 수 있는 RESTful API에서 취득한 특정 데이터의 경우 이 오류는 후행 공백으로 인해 발생할 수 있습니다.이 경우, 간단히 말하면trim데이터는 오류를 피할 수 있습니다.
String trimmed = result1.trim();
그리고나서gson.fromJson(trimmed, T)효과가 있을지도 모릅니다.확실히 이것은 특수한 케이스만을 대상으로 하고 있기 때문에 YMMV.
슬래시를 추가할 필요가 없는 디버거에서는 입력 필드가 특수 문자를 인식합니다.
Java 코드에서는 특수 문자를 이스케이프해야 합니다.
언급URL : https://stackoverflow.com/questions/11484353/gson-throws-malformedjsonexception
'programing' 카테고리의 다른 글
| 모서리에서의 더블 버튼 클릭 방지/처리 (0) | 2023.03.06 |
|---|---|
| JsonNode에 새 노드를 만드는 방법 (0) | 2023.03.06 |
| 커스텀 투고 타입에 기본 카테고리/태그 분류법을 재사용하시겠습니까? (0) | 2023.02.11 |
| add_filter('wp_title')는 타이틀 태그(WordPress 플러그인)를 대체하지 않습니다. (0) | 2023.02.11 |
| 리액트 라우터가 404 상태 코드로 응답하도록 하려면 어떻게 해야 합니까? (0) | 2023.02.11 |