2012-12-19 17 views
6

Używam Umlautów (ä, ü, ö) w Gsonie, które muszę przekazać za pośrednictwem Postu Http.Java: Gson i kodowanie

Niestety, moja aplikacja internetowa zwróci wartość null, jeśli Umlauty nie zostaną w jakiś sposób przekonwertowane, a nie są.

Content-Type jest "application/json"

Jak mogę powiedzieć Gson do kodowania Przegłosy prawidłowo (The Znaki specjalne są w wartościach, a nie klucze)?

+1

„moja aplikacja internetowa zwróci NULL jeśli Znaki specjalne nie są przekształcane w jakiś sposób”, więc problem jest z internetowej aplikacji. –

+0

Jest to aplikacja MVC 4, jeśli to pomaga. Powinien zaakceptować Umlautów bez kodowania w ciele, czy nie? – cdbeelala89

+0

'application/json' musi akceptować Unicode (a tym samym Umlauty.) Z [spec] (http://www.ietf.org/rfc/rfc4627.txt): _" Tekst JSON MUSI być zakodowany w Unicode. kodowanie to UTF-8. "_ Jeśli aplikacja internetowa tego nie zaakceptuje, nie akceptuje JSON. – McDowell

Odpowiedz

2

można spróbować ustawić

charset=UTF-8 

aby wymusić kodowanie.

+0

Niestety to nie pomogło (ustawienie w nagłówku http) – cdbeelala89

0

Możesz kodować umlauty na elementy dziesiętne przed przejściem do gson. od json można dekodować te elementy.

/* encode unicode characters in a given string */ 
    private static String getEncodedText(String text) { 
     StringBuilder sb = new StringBuilder(); 

     for (int i = 0; i < text.length(); i++) { 
      char ch = text.charAt(i); 
      int codePoint = text.codePointAt(i); 

      if (codePoint >= 0 && codePoint <= 126 
        && (codePoint != 34 && codePoint != 39 
          && codePoint != 60 && codePoint != 62 
          && codePoint != 94 && codePoint != 96 && codePoint != '_')) { 
       sb.append(ch); 
       continue; 
      } 


      sb.append(convertToEntity(String.valueOf(codePoint))); 
     } 

     return sb.toString(); 
    } 


    public static String convertToEntity(String decimalValue) { 
     return "&#" + decimalValue+ ";"; 
    } 
+0

Jak to zrobić? Zwykle po prostu do Gons (obiekt). – cdbeelala89

+0

przed ustawieniem wartości na zmienną obiektu, który chcesz przekonwertować json, zastosuj powyższą metodę, aby zakodować ciąg znaków. –

6

Miałem ten sam problem, przekazując umlaut do usługi sieciowej w JSON. Serwer internetowy nie może poprawnie zdekodować tych znaków. Konfigurując HttpClient dla kodowania UTF problem zniknął, tutaj jest mój kod roboczych:

HttpParams httpParams = new BasicHttpParams(); 
HttpProtocolParams.setContentCharset(httpParams, HTTP.UTF_8); 
HttpProtocolParams.setHttpElementCharset(httpParams, HTTP.UTF_8); 
HttpClient client = new DefaultHttpClient(httpParams); 
HttpPost request = new HttpPost(serverURL); 
StringEntity str = null; 
String jsonString = gson.toJson(yourdata); 
str = new StringEntity(jsonString, HTTP.UTF_8); 
request.setEntity(str); 
request.setHeader("Accept", "application/json"); 
request.setHeader("Content-type", "application/json"); 
client.execute(request); 
+0

Dzięki, httpParams były brakującą częścią w moim przypadku. – Locked