【问题标题】:GSON not sending in UTF-8GSON 不发送 UTF-8
【发布时间】:2013-06-13 02:19:43
【问题描述】:

以下方法发送 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);

    }

【问题讨论】:

  • 什么是responseToClient?您是自己编写 HTTP 代码吗?
  • 是的。列出了 HTTP 代码(responseToClient 也是 DataOutputStream
  • @WilliamFalcon,我有 ArrayList 对象,其中包含许多中文和日文字符,如何使用 GSON 库对它们进行序列化,通常意味着我会丢失这些字符并获得 ?其中。
  • 问题不在GSON。问题是字符串的字节编码。在将字符串转换为最终作为响应发送的字节数组时,您需要提及 utf-8 编码

标签: java gson


【解决方案1】:

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

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

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

【讨论】:

  • 我同意,那我该怎么做呢?你有好的教程吗?
  • 我认为最轻量级的可嵌入 HTTP java 解决方案是 Jetty。 eclipse.org/jetty你可以在这里找到很多好的教程:wiki.eclipse.org/Jetty/Tutorial
  • 谢谢。这解决了问题(字节数组)
  • @JanDoerrenhaus,我有 ArrayList 对象,其中包含许多中文和日文字符,如何使用 GSON 库对它们进行序列化,通常意味着我会丢失这些字符并获得 ?其中。
  • @JanDoerrenhaus,你说得对,这不是 Gson 的错,我所做的是阅读 excel 表并将日文字符从其中写入文本文件,然后实现文本文件不支持 UTF-8默认所以我写了一个 .json 文件,我得到了正确的日文字符,很抱歉打扰你,但必须学习一些新东西:)
【解决方案2】:

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

Gson gson = new GsonBuilder().disableHtmlEscaping().create();
String json = gson.toJson(objectToEncode);

【讨论】:

【解决方案3】:

使用以下代码进行编码

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多