返回带有 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 的请求