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
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.