1

我在我的 java servlet 中编写了如下 JSON 响应,其中 JObject 是创建的 JSON 对象

response.setContentType("application/json; charset=UTF-8");
PrintWriter printout = response.getWriter();
printout.print(JObject);
printout.flush();

但它在接收方以文本/纯文本形式接收

[Server: Apache-Coyote/1.1, ETag: W/"XXXXXXXXXX", Last-Modified: Tue, 04 Jun 2013 10:42:31 GMT, Content-Type: text/plain, Content-Length: 2573, Date: Tue, 04 Jun 2013 10:44:01 GMT]

如何获得准确的 JSON 响应?如果我JSON在同一台机器上编写响应,我会得到 JSON 数据。但是,如果我JSON在另一台服务器中编写响应,它会返回为text/plain.

这是JObject

JSONObject JObject = new JSONObject(); 
JObject.put("Response", "1"); 
JObject.put("Message", "Client unauthorized"); 
4

4 回答 4

6

我不确定您在 servlet 中是否有确切的代码。但是我已经创建了一个示例 Servlet,它使用与上述相同的代码返回了 Json 输出。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        response.setContentType("application/json; charset=UTF-8");
        PrintWriter printout = response.getWriter();

        JSONObject JObject = new JSONObject(); 
        JObject.put("Response", "1"); 
        JObject.put("Message", "Client unauthorized"); 

        printout.print(JObject);
        printout.flush();
            // Or
            // printout.write(JObject.toString()); 
    }

{"Message":"Client unauthorized","Response":"1"}在浏览器上得到了输出。

这是结果快照:

在此处输入图像描述

于 2013-06-04T12:04:47.660 回答
1

response.getWriter().write(jsonObj.toString())正在为我工​​作。

于 2013-06-04T11:53:11.417 回答
0

我用 Gson

Gson gson = new Gson();
String jsonData = gson.toJson(student);//here student is object
PrintWriter out = response.getWriter();
try {
    out.println(jsonData);
} finally {
    out.close();
}
于 2020-02-03T05:41:56.717 回答
0

如果您使用 Java 7 的 try-with-resources,请确保将

response.setContentType("application/json");

在您尝试资源之前,因为如果您在之后设置它,它将预先关闭 PrintWriter 并且不会设置任何 contentType。然后,如果它通过 nginx 服务器,它可能会在发现标头中未设置任何内容时将 contentType 设置为纯文本,这正是我的问题。

做这个:

response.setContentType("application/json");

try (PrintWriter out = response.getWriter()) {
    out.println(jsonData);
} 

不是这个:

try (PrintWriter out = response.getWriter()) {
    out.println(jsonData);
} 
// does not set contentType anymore because writer has been flushed already.
response.setContentType("application/json");
于 2020-03-20T20:14:16.993 回答