Solución:
Creo que la forma más sencilla / práctica de consumir JSON es usar una clase Java que se parezca a su JSON: https://stackoverflow.com/a/6019761
Pero si no puede usar una clase Java, puede usar una de estas dos soluciones.
Solución 1: puedes hacerlo recibiendo un Map<String, Object>
desde su controlador:
@RequestMapping(
value = "/process",
method = RequestMethod.POST)
public void process(@RequestBody Map<String, Object> payload)
throws Exception {
System.out.println(payload);
}
Usando su solicitud:
curl -H "Accept: application/json" -H "Content-type: application/json"
-X POST -d '{"name":"value"}' http://localhost:8080/myservice/process
Solucion 2: de lo contrario, puede obtener la carga útil POST como String
:
@RequestMapping(
value = "/process",
method = RequestMethod.POST,
consumes = "text/plain")
public void process(@RequestBody String payload) throws Exception {
System.out.println(payload);
}
Luego, analice la cadena como desee. Tenga en cuenta que debe especificarse consumes = "text/plain"
en su controlador. En este caso debe cambiar su solicitud con Content-type: text/plain
:
curl -H "Accept: application/json" -H "Content-type: text/plain" -X POST
-d '{"name":"value"}' http://localhost:8080/myservice/process
Para agregar a la solución de Andrea, si está pasando una matriz de JSON, por ejemplo
[
{"name":"value"},
{"name":"value2"}
]
Luego, deberá configurar Spring Boot Controller así:
@RequestMapping(
value = "/process",
method = RequestMethod.POST)
public void process(@RequestBody Map<String, Object>[] payload)
throws Exception {
System.out.println(payload);
}
Para recibir Json arbitrario en Spring-Boot, simplemente puede usar Jackson JsonNode
. El convertidor apropiado se configura automáticamente.
@PostMapping(value="/process")
public void process(@RequestBody com.fasterxml.jackson.databind.JsonNode payload) {
System.out.println(payload);
}