Saltar al contenido

Devolver objeto JSON como respuesta en Spring Boot

Esta es la contestación más exacta que te podemos dar, pero primero mírala detenidamente y analiza si se puede adaptar a tu trabajo.

Solución:

Como está utilizando la web Spring Boot, la dependencia de Jackson es implícita y no tenemos que definirla explícitamente. Puede verificar la dependencia de Jackson en su pom.xml en la pestaña de jerarquía de dependencia si usa eclipse.

Y como has anotado con @RestController no hay necesidad de hacer una conversión json explícita. Simplemente devuelva un serializador POJO y jackson se encargará de convertir a json. Es equivalente a usar @ResponseBody cuando se usa con @Controller. En lugar de colocar @ResponseBody en cada método de controlador que colocamos @RestController en lugar de vainilla @Controller y @ResponseBody por defecto se aplica a todos los recursos en ese controlador.
Consulte este enlace: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

El problema al que se enfrenta se debe a que el objeto devuelto (JSONObject) no tiene captador para ciertas propiedades. Y su intención no es serializar este JSONObject sino serializar un POJO. Así que solo devuelve el POJO.

Consulte este enlace: https://stackoverflow.com/a/35822500/5039001

Si desea devolver un json serializado string entonces solo devuelve el string. Spring usará StringHttpMessageConverter en lugar del convertidor JSON en este caso.

La razón por la que su enfoque actual no funciona es porque Jackson se usa de manera predeterminada para serializar y deserializar objetos. Sin embargo, no sabe cómo serializar el JSONObject. Si desea crear una estructura JSON dinámica, puede utilizar un Map, por ejemplo:

@GetMapping
public Map sayHello() 
    HashMap map = new HashMap<>();
    map.put("key", "value");
    map.put("foo", "bar");
    map.put("aa", "bb");
    return map;

Esto conducirá a la siguiente respuesta JSON:

 "key": "value", "foo": "bar", "aa": "bb" 

Esto es un poco limitado, ya que puede resultar un poco más difícil agregar objetos secundarios. Sin embargo, Jackson tiene su propio mecanismo, usando ObjectNode y ArrayNode. Para usarlo, tienes que autoconectar ObjectMapper en su servicio/controlador. Entonces puedes usar:

@GetMapping
public ObjectNode sayHello() 
    ObjectNode objectNode = mapper.createObjectNode();
    objectNode.put("key", "value");
    objectNode.put("foo", "bar");
    objectNode.put("number", 42);
    return objectNode;

Este enfoque le permite agregar objetos secundarios, matrices y usar todos los tipos.

Puede devolver una respuesta como String como lo sugiere @vagaasen o puede usar ResponseEntity Objeto proporcionado por Spring como se muestra a continuación. De esta manera también puedes regresar Http status code que es más útil en la llamada de servicio web.

@RestController
@RequestMapping("/api")
public class MyRestController


    @GetMapping(path = "/hello", produces=MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity sayHello()
    
         //Get data from service layer into entityList.

        List entities = new ArrayList();
        for (Entity n : entityList) 
            JSONObject entity = new JSONObject();
            entity.put("aa", "bb");
            entities.add(entity);
        
        return new ResponseEntity(entities, HttpStatus.OK);
    


Comentarios y valoraciones

Al final de todo puedes encontrar las explicaciones de otros sys admins, tú además tienes la libertad de mostrar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Respuestas a preguntas comunes sobre programacion y tecnología