2012-09-18 13 views
10

我正准备用Jersey创建一个REST-Webservice。 目前我对JSON中字符串或其他值类型的正确表示有点困惑。 这里有两个片段:用Jersey返回字符串的JSON表示

@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(); 
} 

在Browswer中调用该方法将显示没有任何JSON素材(大括号等)的纯字符串:

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

我想通过dojo工具包使用此服务。问题是,当我设置[handleAs:“json”] - 标志时,我得到了第二个方法。它会引发错误“SyntaxError:意外的标记H”,其中“H”是返回字符串的第一个字母。

所以:什么是正确的JSON表示字符串和其他值类型和什么注释,我必须为我的方法来设置产生这些?

回答

5

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

您可以选择这个Tutorial。另一个tutorial

Firefox未显示错误,因为它没有处理您的响应。显示由服务返回的任何内容。然而,该工具包开始处理效应初探作为JSON但没有一个有效的JSON(JSON与{开始)

+0

是它最好创建一个DTO每个操作或为每种类型的我想用创建DTO? – Reini

+0

每种类型的DTO – SiMet

+1

“JSON以{”开头 - 不正确。根据http://json.org甚至一个引用的字符串文字是有效的JSON,并且球衣应该支持正确地将字符串序列化为JSON字符串。 – ddumont

2

您也可以返回它:

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

,但它看起来很奇怪我。

为每个对象创建DTO对于一个String也很奇怪。

有没有更好的选择?

+0

你能解释一下你为什么使用双引号吗? (“”)而不是:return“Something”?我有一个问题,不明白为什么常规字符串不转换为有效的JSON响应 – user1386966

+0

原因是这会返回MediaType应用程序Json,你可以手动返回一些JSON为“{\”a \“:1} “这不是一个字符串。看到答案 – SiMet

1

如果你正在返回一个String为什么你将它定义为一个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(); 
}