tutorial servicios consume java json rest jersey jackson

servicios - Java.util.Map al objeto JSON con Jersey/JAXB/Jackson



response json java rest (4)

No sé por qué esta no es la configuración predeterminada, y me tomó un tiempo averiguarlo, pero si quieres trabajar con la conversión JSON con Jersey, agrega

<init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param>

a su web.xml y todos sus problemas deben ser resueltos.

PD: también debes deshacerte de las anotaciones @XmlRootElement para que funcionen.

He estado tratando de crear un servicio web de Jersey REST. Quiero recibir y emitir objetos JSON de clases Java como las siguientes:

@XmlRootElement public class Book { public String code; public HashMap<String, String> names; }

Esto debería ser convertido a JSON de esta manera:

{ "code": "ABC123", "names": { "de": "Die fabelhafte Welt der Amelie", "fr": "Le fabuleux destin d''Amelie Poulain" } }

Sin embargo no puedo encontrar una solución estándar para esto. Todo el mundo parece estar implementando su propia solution wrapper . Este requisito me parece extremadamente básico; No puedo creer que esta sea la solución generalmente aceptada para esto, especialmente porque Jersey es realmente una de las partes más divertidas de Java.

También he intentado actualizar a Jackson 1.8, que solo me da esto, lo que es extremadamente confuso JSON:

{ "code": "ABC123", "names": { "entry": [{ "key": "de", "value": "Die fabelhafte Welt der Amelie" }, { "key": "fr", "value": "Le fabuleux destin d''Amelie Poulain" }] } }

¿Hay alguna solución propuesta para esto?


Puedes usar google-gson . Aquí hay un código de ejemplo:

@Test public void testGson(){ Book book = new Book(); book.code = "1234"; book.names = new HashMap<String,String>(); book.names.put("Manish", "Pandit"); book.names.put("Some","Name"); String json = new Gson().toJson(book); System.out.println(json); }

La salida es {"code":"1234","names":{"Some":"Name","Manish":"Pandit"}}


Sé que se solicitó hace mucho tiempo, pero las cosas cambiaron mientras tanto, por lo que para el último v2.22 de Jersey que ya no tiene el paquete com.sun.jersey , estas dos dependencias agregadas en el proyecto pom.xml solucionaron el mismo problema :

<dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.22</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.5.4</version> <!-- jackson version used by jersey v2.22 --> </dependency>

No es necesario agregar nada en web.xml . La primera dependencia le indicará a Jersey que use Jackson para transformaciones de POJO a JSON. La segunda dependencia registrará a jackson como proveedor de jersey JSON.

También para el problema nulo en POJO, agregue esta anotación a la clase POJO:

@JsonInclude(JsonInclude.Include.NON_NULL)


@POST @Consumes("application/json") public void createBook(Book book) { ..... ..... }

Por supuesto, usted necesita tener getter / setter para cada propiedad en Book.

Además, la razón por la que se recomienda usar la clase de envoltura (que suele ser un mapa) es evitar la creación de múltiples DTO para cada tipo de datos que desea enviar. Es más fácil simplemente serializar / deserializar usando un mapa y como parte de la lógica de negocios, conviértalo a un POJO correspondiente para su procesamiento interno, especialmente si está usando ese POJO para el mapeo relacional de objetos.