损坏的JSON编码?

时间:2013-01-12 15:47:44

标签: java json serialization gson

我正在从servlet向applet发送同一类的JSON对象,但是 这个类中的所有字符串变量都缺少一些字符,如:' - ','ę','ś','ñ','ł'。 但是,'ó'正常显示(?)。例如: “Zaznacz prawid ow operacj por ó wnywania dw ó ch zmiennych typu“

解决方案 我希望我能更彻底地解释它,但正如亨利注意到的那样,这是导致这个问题的IDE。我使用来自google ticket的farmer1992的课程解决了这个问题。它打印转义的unicode字符(\ u ...) - 这是我的applet正确编码字符的唯一方法。此外,我必须不时重新启动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

2 个答案:

答案 0 :(得分:1)

这些字符应以\ uxxxx格式编码

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

答案 1 :(得分:0)

使用此行

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

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

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