使用JAX-RS将JSON查询参数转换为对象

我有一个JAX-RS资源,它将其参数作为JSON字符串,如下所示:

http://some.test/aresource?query={"paramA":"value1", "paramB":"value2"} 

在这里使用JSON的原因是查询对象在实际用例中可能非常复杂。

我想将JSON字符串转换为Java对象,在示例中为dto:

 @GET @Produces("text/plain") public String getIt(@QueryParam("query") DataTransferObject dto ) { ... } 

JAX-RS是否支持将JSON作为查询参数传递给Java对象的转换?

是的,您可以这样做,但您需要自己编写转换代码。 幸运的是,这很简单,您只需要编写一个具有公共String构造函数的类来进行转换。 例如:

 public class JSONParam { private DataTransferObject dto; public JSONParam(String json) throws WebApplicationException { try { // convert json string DataTransferObject and set dto } catch (JSONException e) { throw new WebApplicationException(Response.status(Status.BAD_REQUEST) .entity("Couldn't parse JSON string: " + e.getMessage()) .build()); } } public DataTransferObject getDTO() { return dto; } } 

然后你可以使用:

 @GET @Produces("text/plain") public String getIt(@QueryParam("query") JSONParam json) { DataTransferObject dto = json.getDTO(); ... } 

如前所述,您需要显式地从String参数转换为JSON。 但是没有必要像org.json的解析器那样使用原始的东西; Jackson或Gson可以在一行或两行中进行数据绑定(String to JSON,JSON to POJO)。 与jackson:

 MyValue value = new ObjectMapper().readValue(json, MyValue.class); 

(对于生产代码,只需创建一次ObjectMapper作为静态成员,重用)

Jackson是大多数JAX-RS实现用于实现POST数据的数据绑定的,所以这非常相似。

添加到Jason的解决方案,使用http://www.json.org/java/ (由Crockford提供):

 import org.json.JSONObject; public class JSONParam { private DataTransferObject dto; public JSONParam(String json) throws WebApplicationException { try { // convert json string DataTransferObject and set dto JSONObject jo = new JSONObject(json); dto.setParamA(jo.getString("paramA")); dto.setParamB(jo.getString("paramB")); // There are other get methods for Integer, Double, etc. // You can also build JSON from Java objects. } catch (JSONException e) { throw new WebApplicationException(Response.status(Status.BAD_REQUEST) .entity("Couldn't parse JSON string: " + e.getMessage()) .build()); } } public DataTransferObject getDTO() { return dto; } } 

不要重新发明轮子:-)

JAX-RS支持使用JAXB(用于XML绑定的Java API)将JavaBean绑定到XML或JSON,反之亦然。 可以在此处找到更多详细信息,例如: http : //www.ibm.com/developerworks/web/library/wa-aj-tomcat/index.html

你需要

  • 在DataTransferObject上添加@XmlRootElement批注
  • 在DataTransferObject中创建一个空的默认构造函数
  • 将@Consumes(MediaType.APPLICATION_JSON)注释添加到WebService

如果您对生成DTO感兴趣,我可以建议jsonschema2pojo吗? 您可以使用JSON Schema定义对象,并自动生成DTO。

一旦编写了模式,您还可以将其提供给您的使用者,以便他们确切了解应如何格式化请求。

也许你可以使用http://docs.spring.io/spring-framework/docs/2.5.x/api/org/springframework/beans/BeanUtils.html

 BeanUtils.copyProperties(source, target)