2010-04-23 13 views
26

que tienen un recurso JAX-RS, que obtiene sus parametros como una cadena JSON como esto:parámetros de consulta Convertir JSON a objetos con JAX-RS

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

La razón para utilizar JSON aquí, es que la consulta objeto puede ser bastante complejo en casos de uso real.

me gustaría convertir la cadena JSON a un objeto Java, dto en el ejemplo:

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

¿Se JAX-RS apoyan tal conversión de JSON pasa como un parámetro de consulta para los objetos de Java?

Respuesta

15

Sí, puede hacerlo, pero tendrá que escribir el código de conversión usted mismo. Afortunadamente, esto es fácil, solo necesita escribir una clase que tenga un constructor público String para hacer la conversión. Por ejemplo:

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; 
    } 
} 

continuación, puede utilizar:

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

Dado que todo parece que el 'JSONParam' hace es envolver el 'DataTransferObject' y utilizar una cadena de constructor basado haría ... ¿Es posible simplemente agregar un constructor basado en String al 'DataTransferObject'? – hypno7oad

8

agregarlo a la solución de Jason, utilizando http://www.json.org/java/ (cortesía de 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; 
    }     
} 

No reinventar la rueda :-)

+0

Si no pasa su objeto JSON por parámetro, no puede usar esta solución. Pero puede usar la versión que lili sugiere ([lili] (http://stackoverflow.com/a/6250744/853510)) –

11

Como se mencionó, es necesario convertir explícitamente del parámetro String a JSON. Pero no es necesario usar algo tan primitivo como el analizador de org.json; Jackson o Gson pueden hacer el enlace de datos (String a JSON, JSON a POJO) en una línea o dos. Con Jackson:

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

(para el código de producción, basta con crear ObjectMapper miembro de una vez como estática, reutilización)

Jackson es lo que la mayoría de JAX-RS implementaciones utilizan para implementar enlace de datos para los datos POST, por lo que este es bastante parecido.

0

Si está interesado en generar sus DTO, ¿puedo sugerir jsonschema2pojo? Puede definir sus objetos usando JSON Schema y hacer que sus DTO se generen automáticamente.

Una vez que haya escrito el esquema, también puede dárselo a sus consumidores para que entiendan exactamente cómo deben formatearse las solicitudes.

4

JAX-RS admite el uso de JAXB (Java API for XML Binding) para vincular un JavaBean a XML o JSON y viceversa. Más detalles se pueden encontrar aquí, por ejemplo: http://www.ibm.com/developerworks/web/library/wa-aj-tomcat/index.html

Necesitas

  • añadir una anotación en @XmlRootElement DataTransferObject
  • Cree que es un constructor por defecto vacía en DataTransferObject
  • Añadir @Consumes (MediaType.APPLICATION_JSON) anotación a su servicio Web
+0

Si necesita un ejemplo, vea [https://blogs.oracle.com/enterprisetechtips /entry/configuring_json_for_restful_web](https://blogs.oracle.com/enterprisetechtips/entry/configuring_json_for_restful_web) busca StatusInfoBean. –

Cuestiones relacionadas