【问题标题】:Returning the JSON representation of a String with Jersey返回带有 Jersey 的字符串的 JSON 表示
【发布时间】:2012-09-10 16:55:18
【问题描述】:

我即将使用 Jersey 设置一个 REST-Webservice。 目前,我对 JSON 中字符串或其他值类型的正确表示有点困惑。 这里有两个sn-ps:

@GET
@Path("user")
@Produces( MediaType.APPLICATION_JSON)
public User user() {
    return new User("reini", "admin");
}

在浏览器中调用此方法将显示一个“好的”JSON 字符串,如下所示:

{"name":"reini","role":"admin"}

我的第二种方法是这样的:

@GET
@Path("hello/{name}")
@Produces( MediaType.APPLICATION_JSON)
public String hello(@PathParam("name") String name) {
    return "Hello " + name + ", it is " + new Date();
}

在浏览器中调用该方法将显示一个没有任何 JSON 内容(花括号等)的纯字符串:

Hello firefox, it is Tue Sep 18 13:52:57 CEST 2012

我想通过 dojo 工具包使用此服务。问题是,一旦我设置了 [handleAs: "json"]-flag,我就会得到第二种方法。它向我抛出一个错误“SyntaxError: Unexpected token H”,其中“H”是返回字符串的第一个字母。

那么:字符串和其他值类型的正确 json 表示形式是什么?我必须为我的方法设置哪些注释才能生成这些?

【问题讨论】:

    标签: java javascript json dojo jersey


    【解决方案1】:

    您应该定义一个DTO 并将您的String 放入其中。因此,您将拥有一个带有一个 String 作为属性的 HelloResp 类。在您的方法中填充该属性并返回。

    您可以查看此Tutorial。另一个tutorial

    Firefox 没有显示错误,因为它没有处理您的响应。显示服务返回的任何内容。然而,该工具包开始将响应作为 JSON 处理,但不是有效的 JSON(JSON 以 { 开头)

    【讨论】:

    • 是为每个操作创建一个 DTO 还是为我要使用的每种类型创建一个 DTO 更好?
    • "JSON 以 {" 开头 - 不正确。根据json.org,即使是带引号的字符串文字也是有效的 JSON,并且球衣应该支持将字符串正确序列化为 JSON 字符串。
    【解决方案2】:

    如果你要返回一个字符串,为什么要将它定义为 JSON 类型?

    只需将其作为纯文本 (MediaType.TEXT_PLAIN) 返回:

    @GET
    @Path("hello/{name}")
    @Produces( MediaType.TEXT_PLAIN)
    public String hello(@PathParam("name") String name) {
        return "Hello " + name + ", it is " + new Date();
    }
    

    【讨论】:

      【解决方案3】:

      您也可以将其返回为:

      @GET
      @Path("hello/{name}")
      @Produces( MediaType.APPLICATION_JSON)
      public String hello(@PathParam("name") String name) {
          return "\"Hello " + name + ", it is " + new Date()+'"';
      }
      

      但这对我来说看起来很奇怪。

      为每个对象创建 DTO 对于一个字符串来说也很奇怪。

      还有更好的选择吗?

      【讨论】:

      • 您能解释一下为什么要使用双引号吗? ("") 而不是仅仅:返回 "Something" ?我对此有疑问,不明白为什么常规字符串没有转换为有效的 json 响应
      • 原因是这会返回 MediaType Application Json,您可以手动将一些 json 返回为 "{\"a\": 1}" 这不是字符串。查看经过验证的答案
      猜你喜欢
      • 2018-03-14
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多