2013-06-13 7 views
8

Die folgende Methode sendet eine JSON-Antwort. Auf der Empfängerseite bekomme ich jedoch ungültige Zeichen und UTF-8 dekodiert die Daten nicht. Was mache ich falsch?GSON sendet UTF-8 nicht

Antwort auf client = Datenausgabestrom

//Get the client request 
      clientRequest = new BufferedReader(new InputStreamReader(connectedClient.getInputStream())); //connectedclient = socket 

      //Start response object 
      responseToClient = new DataOutputStream(connectedClient.getOutputStream()); 


/** 
    * Sends a JSON response for an object 
    * @param objectToEncode 
    * @throws Exception 
    */ 
    private void sendJSONResponse(Object objectToEncode) throws Exception{ 

     //Encode object into JSON 
     String jsonString = new Gson().toJson(objectToEncode); 

     // HTTP Header... Status code, last modified 
     responseToClient.writeBytes(HTTP_OK_STATUS_CODE); 
     responseToClient.writeBytes(CONTENT_TYPE_JSON); 
     responseToClient.writeBytes("Last-modified: "+ HelperMethods.now() +" \r\n"); 
     responseToClient.writeBytes("\r\n"); 

     // The HTTP content starts here 
     responseToClient.writeBytes(jsonString); 

    } 
+0

zu kodieren Was ist 'responseToClient'? Schreiben Sie Ihren HTTP-Code selbst? –

+0

JA. Der HTTP-Code ist aufgeführt (auch responseToClient ist ein DataOutputStream –

+0

@WilliamFalcon, ich habe ArrayList-Objekt, das viele chinesische und japanische Zeichen enthält, Wie kann ich sie mit GSON-Bibliothek serialisieren, durch übliche Mittel verliere ich diese Zeichen und **? ** –

Antwort

15

Ich habe keine Ahnung, warum Sie Ihren eigenen HTTP-Protokoll-Code schreiben würden. Es ist ähnlich wie das Schreiben eines eigenen XML-Parsers: Egal, wie gut Sie ein Programmierer sind, Sie werden es zwangsläufig falsch verstehen.

Jedenfalls, wie die DataOutputStream Dokumentation besagt, macht writeBytes auf einem String einfach seine hohen acht Bits verwerfen. Also, was Sie bekommen, ist ... etwas, aber nicht UTF8. Was Sie tun sollten:

String jsonString = new Gson().toJson(objectToEncode); 
byte[] utf8JsonString = jsonString.getBytes("UTF8"); 
responseToClient.write(utf8JsonString, 0, utf8JsonString.Length); 
+0

Ich stimme zu, was würde ich verwenden, um es dann für mich zu tun, und haben Sie ein gutes Tutorial? –

+0

Die leichteste einbettbare HTTP-Java-Lösung wäre Jetty, denke ich. http://www.eclipse.org/jetty/Sie können viele gute Tutorials hier finden: http://wiki.eclipse.org/Jetty/Tutorial –

+0

Danke.Das hat das Problem behoben (das Byte-Array) –

0

Verwenden Sie den folgenden Code

response.setCharacterEncoding("UTF8"); // this line solves the problem 
response.setContentType("application/json");