【问题标题】:java JSON text encoding issuejava JSON文本编码问题
【发布时间】:2013-03-20 04:37:41
【问题描述】:

在我的应用程序中,我从名为 Google Search Appliance(GSA) 的外部工具检索 JSON 格式的搜索结果。

来自 GSA 的 JSON 结果非常大,因此我更喜欢将 GSA JSON 结果修改为更适合在我的网页上显示的内容。

如果我直接显示 GSA JSON 结果而不在我的 java 代码中对其进行格式化,我不会在我的网页上遇到任何编码问题。

但是,如果我在我的 servlet java 代码中将大型 GSA JSON 结果格式化为合适的 JSON 格式,我将面临编码问题。 示例 - “All Access Pass” 显示为 ÂAll Access PassÂ

我使用以下代码将修改后的 json 从我的 servlet 返回到网页 -

response.setContentType("application/json;charset=UTF-8");

我尝试将字符集更改为iso-8859-1,但没有任何区别。

我以以下方式编辑我的原始 JSON -

        String responseText = getMethod.getResponseBodyAsString();

        JSONObject resultJSON = new JSONObject();
                try {

                    JSONObject jsonObj = new JSONObject(responseText);

                    JSONArray resultJsonArray = jsonObj
                            .getJSONArray("RES");

                    JSONObject searchResultJSON = null;

                    for (int iCnt = 0; iCnt < resultJsonArray.length(); iCnt++) {

                        searchResultJSON = new JSONObject();

                        JSONObject obj = resultJsonArray.getJSONObject(iCnt);
                        JSONObject metaTagObj = obj
                                .getJSONObject("MT");

                        if (metaTagObj.has(("title"))) {
                         searchResultJSON.put("title",metaTagObj.get("title").toString());
                        }
             resultJSON.accumulate("RES", searchResultJSON);
    }
   response.setContentType("application/json;charset=UTF-8"); 
   response.getWriter().print(resultJSON);

    }catch(JSONException e){}

我要在这里对原始 JSON 的修改可以在 JavaScript 中完成,这将解决我的问题,但这是我不想做的事情。

  1. 有没有办法找出原始 GSA JSON 中文本的编码格式?
  2. 如何避免 java 代码更改原始 GSA JSON 中的文本编码?

请帮助我了解这里发生了什么以及如何避免这个问题。

【问题讨论】:

  • 我很好奇原始 JSON 如何格式化相同的字符。您将其转换成的“合适的 JSON 格式”是什么?你如何转换它?
  • 我的代码唯一不同的是,当我显示原始JSON时,我将响应内容类型设置为(“application/json”)。但是,如果我对修改后的 JSON 做同样的事情,我会得到“??”字符,所以我将其设置为“application/json;charset=UTF-8”。
  • 那些引用通常来自微软应用程序......所以我搜索了一下,找到了this,这让我想知道你是否需要阅读“微软的 Windows-1252 字符编码”。或者也许我已经走了……
  • 然后我找到了this...(我现在很无聊!)
  • 我将原始 JSONObject 字符串转换为 org.apache.sling.commons.json.JSONObject。然后我遍历 JSON 上的名称值对中的各个对象,并将其设置为另一个 org.apache.sling.commons.json.JSONObject 对象。例如 - newJSONObject.put("title",originalJSON.get("T").toString());

标签: java json character-encoding google-search-appliance windows-1252


【解决方案1】:

发生文本编码问题是因为使用 Apache HTTP 客户端对 GSA 服务器进行的调用使用了默认的内容编码字符集 iso-8859-1,但 GSA 服务器希望 HTTP 客户端请求和响应位于 @ 987654322@编码。

设置 HTTPClient 的编码后,此问题得到解决 -

HttpClient httpClient = new HttpClient();
httpClient.getParams().setContentCharset("UTF-8");

并将servlet响应编码为

response.setContentType("application/json;charset=UTF-8");

【讨论】: