使用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)