Mi pregunta es esencialmente un seguimiento de esta pregunta.
@RestController
public class TestController
{
@RequestMapping("/getString")
public String getString()
{
return "Hello World";
}
}
En lo anterior, Spring agregaría "Hello World" en el cuerpo de respuesta. ¿Cómo puedo devolver una cadena como respuesta JSON? Entiendo que podría agregar citas, pero eso se siente más como un truco.
Proporcione algunos ejemplos para ayudar a explicar este concepto.
Nota: No quiero que esto se escriba directamente en el cuerpo de Respuesta HTTP, quiero devolver la Cadena en formato JSON (estoy usando mi Controlador con RestyGWT que requiere que la respuesta esté en formato JSON válido).
Respuestas:
Cualquiera de retorno
text/plain
(como en el de vuelta Solamente el mensaje de cadena a partir de la primavera del controlador MVC 3 ) o una envoltura de la cadena es un objetoEstablezca su tipo de respuesta en
MediaType.APPLICATION_JSON_VALUE
(="application/json"
)y tendrás un JSON que se parece a
fuente
Collections.singletonMap("response", "your string value")
para lograr el mismo resultado sin tener que crear una clase de contenedor.Collections.singleton("your string value")
JSON es esencialmente una cadena en contexto PHP o JAVA. Eso significa que la cadena que es JSON válida se puede devolver en respuesta. Lo siguiente debería funcionar.
Esto está bien para una respuesta de cadena simple. Pero para una respuesta JSON compleja, debe usar la clase de contenedor como lo describe Shaun.
fuente
En un proyecto abordamos esto usando JSONObject ( información de dependencia de Maven ). Elegimos esto porque preferimos devolver una cadena simple en lugar de un objeto contenedor. Una clase auxiliar interna podría usarse fácilmente en su lugar si no desea agregar una nueva dependencia.
Ejemplo de uso:
fuente
"\"Hello World\""
funcionaría igual de bien sin la dependencia adicional, eso es lo queJSONObject.quote()
hace, ¿verdad?Puede regresar fácilmente
JSON
con laString
propiedad de laresponse
siguiente manerafuente
Simplemente anule el registro de la
StringHttpMessageConverter
instancia predeterminada :Probado con métodos de controlador de acciones de controlador y controladores de excepción de controlador:
Notas finales
extendMessageConverters
está disponible desde Spring 4.1.3, si se está ejecutando en una versión anterior, puede implementar la misma técnica usandoconfigureMessageConverters
, solo requiere un poco más de trabajo.fuente
converters.removeIf(c -> c instanceof StringHttpMessageConverter)
Sé que esta pregunta es antigua, pero también me gustaría contribuir:
La principal diferencia entre otras respuestas es el retorno del hashmap.
Esto devolverá:
fuente
Hacer simple:
fuente
Añadir
produces = "application/json"
en la@RequestMapping
anotación como:Sugerencia: como valor de retorno, recomiendo usar
ResponseEntity<List<T>>
type. Debido a que los datos producidos en el cuerpo JSON deben ser una matriz o un objeto de acuerdo con sus especificaciones, en lugar de una sola cadena simple . A veces puede causar problemas (por ejemplo, Observables en Angular2).Diferencia:
regresó
String
como json:"example"
regresó
List<String>
como json:["example"]
fuente
Agregue una
@ResponseBody
anotación, que escribirá los datos de retorno en la secuencia de salida.fuente
@PostMapping(value = "/some-url", produces = APPLICATION_JSON_UTF8_VALUE)
Este problema me ha vuelto loco: Spring es una herramienta tan potente y, sin embargo, algo tan simple como escribir una cadena de salida como JSON parece imposible sin hacks feos.
Mi solución (en Kotlin) que encuentro menos intrusiva y más transparente es usar un consejo de controlador y verificar si la solicitud fue a un conjunto particular de puntos finales (API REST normalmente, ya que a menudo queremos devolver TODAS las respuestas de aquí como JSON y no hacer especializaciones en el frontend en función de si los datos devueltos son una cadena simple ("¡No deserialización JSON!") o algo más ("¡Deserialización JSON!")). El aspecto positivo de esto es que el controlador sigue siendo el mismo y sin hacks.
El
supports
método se asegura de que todas las solicitudes que fueron manejadas porStringHttpMessageConverter
(por ejemplo, el convertidor que maneja la salida de todos los controladores que devuelven cadenas simples) se procesen y en elbeforeBodyWrite
método, controlamos en qué casos queremos interrumpir y convertir la salida a JSON (y modificar los encabezados en consecuencia).Espero que en el futuro obtengamos una anotación simple en la que podamos anular la que
HttpMessageConverter
debería usarse para la salida.fuente
Agregue esta anotación a su método
fuente