如何在我的Web服务中创建自定义JSON/XML响应
问题描述:
我正在使用JAX-RS创建Web服务。我知道你可以使用JAXB注释来注释域模型,然后靠后看整个类被转换为XML/JSON。但是,这不适用于我的应用程序中的所有场景。将类整理为XML并不总是合适的。有时候我只需要一些字段等,我也希望能够在域模型中没有表示的动态添加自定义元素。如何在我的Web服务中创建自定义JSON/XML响应
你会怎么做?我是否需要为此使用其他框架?我刚刚找到GSON,值得一看吗?我的资源的XML表示并不重要。如果我正在使用GSON,那么Web服务应该如何响应?你只是使用String作为返回类型吗?
伪代码,并没有在GSON看着呢。
@Produce("application/json")
public String someMethod() {
return gson.toJSON();
}
答
在您拥有多变量响应类型的通常最好使用javax.ws.rs.core.Response作为回报的情况下。这使您可以在运行时完全控制确定将要打包并返回的实际实体。
然后,您可以调用你的资源方法时,决定是返回的核心业务对象,或围绕业务对象的包装,或自定义序列化的版本(作为字符串)。粗糙的伪代码:
@Produce("application/json")
public Response someMethod() {
switch(mySpecialCase) {
case 1:
return Response.ok(coreEntity).build(); break;
case 2:
return Response.ok(new LiteEntity(coreEntity)).build(); break;
case 3:
return Response.ok(Util.toGSON(coreEntity).toString()).build(); break;
}
}
这种方法的优点是服务器端拦截仍会触发,并在你的实体对象进行翻译,以便您仍然可以利用在即时序列化JSON和XML,但同时你可以通过使用String作为实体类型来规避翻译。
答
你不应该返回字符串,但类型。
例如:
@Produces(MediaType.APPLICATION_JSON)
public Person String getPerson() {
return personDao.getPerson();
}
请添加依赖(通过行家例如)在:
球衣JSON的罐子
你也应该改变你的web.xml,在新泽西开始支持JSON的,由这样的:
记
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
裸露我的解决方案并不需要执行Person类的特殊注解。
我知道如何使用json和jersey - 你想要说明吗? –
如果他们根据问题与我想要的相关,那么是的。 – LuckyLuke
好吧,我没有在我的答案中使用GSon,但是我对Jersey和JSon的了解,我希望这是可以的。在工作中,我可以告诉你,我们使用RESTEasy而不是泽西,杰克逊而不是Gson,但我更愿意为你带来泽西岛的代码片段 - JAX-RS的RI。 –