返回带有 Jersey 的字符串的 JSON 表示

Posted

技术标签:

【中文标题】返回带有 Jersey 的字符串的 JSON 表示【英文标题】:Returning the JSON representation of a String with Jersey 【发布时间】: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 表示形式是什么?我必须为我的方法设置哪些注释才能生成这些?

【问题讨论】:

【参考方案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" 这不是字符串。查看经过验证的答案

以上是关于返回带有 Jersey 的字符串的 JSON 表示的主要内容,如果未能解决你的问题,请参考以下文章

JERSEY - 将javax.ws.rs.core.Response作为JSON对象返回,并带有错误:...或令牌:

jersey 2.0 jaxrs RI - 在异常时返回 json 字符串

在 Jackson/Jersey JAVA 上发布带有多个参数 JSON 和 String 的请求

在 JSON 响应中返回文件/文件 (Java-Jersey-ReST)

Jersey / Rest 默认字符编码

JAX-RS(Jersey 2 实现)内容协商,带有 URL 扩展名 .xml 或 .json