12

以下方法发送 JSON 回复。但是在接收端,我不断收到无效字符,并且 UTF-8 没有解码数据。我究竟做错了什么?

响应客户端=数据输出流

//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);

    }
4

3 回答 3

25

我不知道你为什么要编写自己的 HTTP 协议代码。这很像编写自己的 XML 解析器:无论您是多么优秀的程序员,您都一定会出错。

无论如何,正如DataOutputStream文档所述,writeBytes对 String 执行操作只会丢弃其高八位。所以你得到的是......一些东西,但不是UTF8。你应该做的是:

String jsonString = new Gson().toJson(objectToEncode);
byte[] utf8JsonString = jsonString.getBytes("UTF8");
responseToClient.write(utf8JsonString, 0, utf8JsonString.Length);
于 2013-06-13T02:37:53.977 回答
11

第一个解决方案对我不起作用,我这样做了:

Gson gson = new GsonBuilder().disableHtmlEscaping().create();
String json = gson.toJson(objectToEncode);
于 2019-11-12T15:34:20.820 回答
3

使用以下代码进行编码

 response.setCharacterEncoding("UTF8"); // this line solves the problem
 response.setContentType("application/json");
于 2017-03-21T10:36:11.937 回答