【问题标题】:Corrupted JSON encoding?损坏的 JSON 编码?
【发布时间】:2013-01-12 15:47:44
【问题描述】:

我正在将同一类的 JSON 对象从 servlet 发送到 applet,但是 此类中的所有字符串变量都缺少一些字符,例如:'ą'、'ę'、'ś'、'ń'、'ł'。 但是,“ó”会正常显示 (?)。例如: "Zaznacz prawid?ow? 歌剧? porównywania dwóch zmiennych打字”

解决方案 我希望我能更彻底地解释它,但正如亨利注意到的那样,是 IDE 导致了这个问题。我使用谷歌票上的farmer1992类解决了它。它打印转义的 unicode 字符 (\u...) - 这是我的小程序正确编码字符的唯一方法。此外,我必须不时重新启动 NetBeans IDE 以强制 Tomcat servlet 正常工作(我不知道为什么 :))。

Servlet 代码(已更新解决方案):

//begin of the servlet code extract
public void sendToApplet(HttpServletResponse response, String path) throws IOException
{
    TestServlet x = new TestServlet();
    x.load(path);

    String json = new Gson().toJson(x);
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/json;charset=UTF-8");

    PrintWriter out = response.getWriter();
    //out.print(json);
    //out.flush();
    GhettoAsciiWriter out2 = new GhettoAsciiWriter(out);
    out2.write(json);
    out2.flush();

}
//end of the servlet code extract

小程序代码:

//begin of the applet code extract
public void retrieveFromServlet(String path) throws MalformedURLException, IOException
{
    String encoder = URLEncoder.encode(path, "UTF-8");
    URL urlServlet = new URL("http://localhost:8080/ProjektServlet?action=" + encoder);
    URLConnection connection = urlServlet.openConnection();
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);
    connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");

    InputStream inputStream = connection.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
    String json = br.readLine();
    Test y = new Gson().fromJson(json, Test.class);
    inputStream.close();
}
//end of the applet code extract

【问题讨论】:

  • 什么编码?如果它包含字符串,你确定有正确读取吗?

标签: java json serialization gson


【解决方案1】:

那些字符应该以 \uxxxx 形式编码

你可以看到这张票 http://code.google.com/p/google-gson/issues/detail?id=388#c4

【讨论】:

  • 这张票并不意味着 Gson 不能处理 Unicode 字符。我经常使用 Gson 构建 UTF-8 编码的 JSON,这是规范所允许的,没有问题。
  • 我使用这个类来打印 JSON。在浏览器中测试 - 结果与上面相同:Zaznacz prawid\u0142ow\u0105 operacj\u0119 por\u00f3wnywania dw\u00f3ch zmiennych typu... 慢慢失去耐心...
  • @BMC 字符如 \u0142ow 可以安全地使用 gson 解码,如果您看不到检查您的字体设置
【解决方案2】:

用这条线

BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

将使用平台字符编码(可能是也可能不是 UTF-8)。尝试使用

显式设置编码
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));

【讨论】:

  • 没有帮助。现在得到'?在黑色背景上而不是“ó”。
  • 你能检查一下小程序中json的值是ok还是已经损坏?现在写和读代码好像没问题了。
  • 它已经损坏。我还通过在 Netbeans 中使用“运行文件”启动它来检查我的 servlet。这是返回给浏览器的内容:Zaznacz prawid\u0142ow\u0105 operacj\u0119 por\u00f3wnywania dw\u00f3ch zmiennych typu
  • 您是否在此处添加了 unicode 转义序列以提高可读性,或者它们是否确实包含在字符串中?
  • 不,我没有。这部分我直接贴在这里了。
猜你喜欢
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2016-07-28
  • 2021-06-26
相关资源
最近更新 更多