JSON反序列化失败? (servlet-> applet通信)

时间:2013-01-11 17:22:34

标签: java json serialization gson

我正在尝试发送一些简单的字符串来测试我的servlet和applet之间的数据传输 (servlet - > applet,而不是applet - > servlet),使用Json格式和Gson库。 applet中的结果字符串应与原始消息完全相同,但事实并非如此。 我得到9个字符< !DOCTYPE 字符串。

编辑:看起来servlet返回的是HTML网页而不是JSON,不是吗? edit2:在NetBeans中使用“运行文件”命令启动servlet时,消息在浏览器中正确显示。

请你看看我的代码:

的Servlet

//begin of the servlet code extract
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException
{
    PrintWriter out = response.getWriter();
    try
    {
        String action;
        action = request.getParameter("action");
        if ("Transfer".equals(action))
        {
            sendItToApplet(response);
        }
    }
    finally
    {
        out.close();
    }
}

public void sendItToApplet(HttpServletResponse response) throws IOException
{
    String messageToApplet = new String("my message from the servlet to the applet");
    String json = new Gson().toJson(messageToApplet);
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");

    Writer writer = null;
    writer = response.getWriter();
    writer.write(json);
    writer.close();
}
//end of the servlet code extract

小程序:

//begin of the applet code extract
public void getItFromServlet() throws MalformedURLException, IOException, ClassNotFoundException
{
    URL urlServlet = new URL("http://localhost:8080/Srvlt?action=Transfer");
    URLConnection connection = urlServlet.openConnection();
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setUseCaches(false);
    connection.setRequestProperty("Content-Type", "application/json");

    InputStream inputStream = connection.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
    JsonReader jr = new JsonReader(br);
    String retrievedString = new Gson().fromJson(jr, String.class);
    inputStream.close();
    jtextarea1.setText(retrievedString); //jtextarea is to display the received string from the servlet in the applet
}
//end of the applet code extract

1 个答案:

答案 0 :(得分:1)

问题是你没有从你的servlet发送JSON,正如你从你的评论中找到的那样。这是因为...... Gson对你要做的事情非常困惑。

如果你在servlet中测试你的JSON序列化(来自toJson()的输出),你会发现...它没有做任何事情而只是简单地用引号返回String的内容它。 JSON基于对象的文本表示(类'字段到值),并且它当然不希望使用String对象执行此操作;默认序列化是为了将String内容放入生成的JSON中。

编辑添加: Gson的典型用法如下:

class MyClass {
    String message = "This is my message";
}

...

String json = new Gson().toJson(new MyClass());

生成的JSON将是:

  

{“message”:“这是我的留言”}