繁体   English   中英

JSON 响应以文本形式返回

[英]JSON response is returning as text

我在我的 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"); 

我不确定您在 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"}作为输出。

这是结果快照:

在此处输入图片说明

response.getWriter().write(jsonObj.toString())对我response.getWriter().write(jsonObj.toString())

我使用 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();
}

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

response.setContentType("application/json");

在您尝试使用资源之前,因为如果您在之后设置它,它将事先关闭 PrintWriter 并且不会设置任何内容类型。 然后,如果它通过 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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM