【问题标题】:Empty object in browser when returning JSONObject返回 JSONObject 时浏览器中的空对象
【发布时间】:2013-02-18 16:44:43
【问题描述】:

我有这个方法:

@GET
@Path("/myservice")
@Produces(MediaType.APPLICATION_JSON)
public Response mysercice() {

   boolean userExists = false;
   CacheControl cacheControl = new CacheControl();
   cacheControl.setNoCache(true);
   cacheControl.setNoStore(true);

   JSONObject jsonObject = new JSONObject();
   jsonObject.put("userExists", userExists);
   return Response.ok(jsonObject, MediaType.APPLICATION_JSON).cacheControl(cacheControl).build();

}

在浏览器中访问方法的url时,得到{},表示对象为空。 所以,我尝试使用:

return Response.ok(jsonObject.toString(), MediaType.APPLICATION_JSON).cacheControl(cacheControl).build();

所以,我进入浏览器 {"userExists" : false} 但我不明白为什么在简单地返回 JSONObject 时,我们会在浏览器中得到一个空对象。

【问题讨论】:

  • 因为java对象不存储为字符串所以返回对象和它的字符串表示是完全不同的东西。
  • 您的浏览器不知道您的复杂对象是如何序列化的 - Java、.Net、Python .. 您的 HTTP 协议也是如此。但他们确实理解字符串对象。
  • 但在代码中,我有一个示例返回一个简单的 java 对象(所有属性都是字符串),在此示例中,该对象在浏览器中不是空的。那么,为什么在 JSONObject 的情况下它是空的呢?

标签: java json rest


【解决方案1】:

大多数 JAX-RS 实现都带有用于将响应实体映射到 JSON 的提供程序。所以当你写的时候:

return Response.ok(jsonObject, MediaType.APPLICATION_JSON).build();

您基本上是在请求 JAX-RS 提供程序为您将 JSONObject 编组为 JSON。唯一的问题是 JSONObject 并不是真的要以这种方式序列化。相反,它旨在用于逐步构建 JSON 表示,然后将该表示转换为 JSON 字符串值。你有两个选择:

  1. 创建一个 POJO,其中包含您要发送回客户端的所有字段。在您的方法中返回此 POJO,它将自动转换为 JSON (`return Response.ok(myPojo, MediaType.APPLICATION_JSON).build()

  2. 直接将 JSON 数据作为字符串返回(您在示例中已经这样做了)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多