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

Java 使用JAX-RS将JSON查询参数转换为对象,java,json,jakarta-ee,jax-rs,Java,Json,Jakarta Ee,Jax Rs,我有一个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") DataTransf

我有一个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对象的这种转换吗?

是的,您可以这样做,但您需要自己编写转换代码。幸运的是,这很容易,您只需要编写一个具有公共
字符串的类来进行转换。例如:

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

添加到Jason的解决方案中,使用(Crockford提供):


不要重新发明轮子:-)

如前所述,您确实需要显式地将字符串参数转换为JSON。但是没有必要使用像org.json的解析器这样的基本元素;或者可以在一两行中进行数据绑定(字符串到JSON,JSON到POJO)。与杰克逊一起:

MyValue value = new ObjectMapper().readValue(json, MyValue.class);
(对于生产代码,只需创建一次ObjectMapper作为静态成员,然后重用)


Jackson是大多数JAX-RS实现用于实现POST数据的数据绑定的工具,因此这非常类似。

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


编写完模式后,您还可以将其提供给您的消费者,以便他们准确地了解请求的格式。

JAX-RS支持使用JAXB(用于XML绑定的Java API)将JavaBean绑定到XML或JSON,反之亦然。可在此处找到更多详细信息,例如:

你需要

  • 在DataTransferObject上添加@XmlRootElement注释
  • 在DataTransferObject中创建一个空的默认构造函数
  • 将@Consumes(MediaType.APPLICATION_JSON)注释添加到您的Web服务中
    • 也许你可以


      由于“JSONParam”似乎只包装“DataTransferObject”并使用基于字符串的构造函数。。。是否可以将基于字符串的构造函数添加到“DataTransferObject”中?您可以阅读更多信息。如果需要示例,请参阅查找StatusInfoBean。如果不通过参数传递JSON对象,则无法使用此解决方案。但是你可以使用lili建议的版本()
      MyValue value = new ObjectMapper().readValue(json, MyValue.class);
      
      BeanUtils.copyProperties(source, target)