如何在我的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(); 
} 
+0

我知道如何使用json和jersey - 你想要说明吗? –

+0

如果他们根据问题与我想要的相关,那么是的。 – LuckyLuke

+0

好吧,我没有在我的答案中使用GSon,但是我对Jersey和JSon的了解,我希望这是可以的。在工作中,我可以告诉你,我们使用RESTEasy而不是泽西,杰克逊而不是Gson,但我更愿意为你带来泽西岛的代码片段 - JAX-RS的RI。 –

在您拥有多变量响应类型的通常最好使用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类的特殊注解。