Minha pergunta é essencialmente um acompanhamento para essa pergunta.
@RestController
public class TestController
{
@RequestMapping("/getString")
public String getString()
{
return "Hello World";
}
}
Acima, o Spring adicionaria "Hello World" ao corpo da resposta. Como posso retornar uma String como uma resposta JSON? Entendo que poderia adicionar aspas, mas isso parece mais um hack.
Forneça quaisquer exemplos para ajudar a explicar esse conceito.
Nota: não quero que isso seja gravado diretamente no corpo da resposta HTTP, quero retornar a String no formato JSON (estou usando meu Controller com RestyGWT, que exige que a resposta esteja no formato JSON válido).
Respostas:
Retornar
text/plain
(como em Retornar apenas mensagem de string do Spring MVC 3 Controller ) OU envolver sua String é algum objetoDefina seu tipo de resposta para
MediaType.APPLICATION_JSON_VALUE
(="application/json"
)e você terá um JSON que se parece
fonte
Collections.singletonMap("response", "your string value")
para obter o mesmo resultado sem precisar criar uma classe de wrapper.Collections.singleton("your string value")
JSON é essencialmente uma String no contexto PHP ou JAVA. Isso significa que a string JSON válida pode ser retornada em resposta. A seguir deve funcionar.
Isso é bom para uma resposta simples de string. Mas para uma resposta JSON complexa, você deve usar a classe wrapper conforme descrito por Shaun.
fonte
Em um projeto, abordamos isso usando JSONObject (maven dependency info ). Nós escolhemos isso porque preferimos retornar uma String simples em vez de um objeto wrapper. Uma classe auxiliar interna pode ser facilmente usada se você não quiser adicionar uma nova dependência.
Exemplo de uso:
fonte
"\"Hello World\""
isso funcionaria tão bem sem a dependência extra - é isso queJSONObject.quote()
funciona, certo?Você pode retornar facilmente
JSON
com aString
propriedade daresponse
seguinte maneirafonte
Simplesmente cancele o registro da
StringHttpMessageConverter
instância padrão :Testado com os métodos do manipulador de ações do controlador e com os manipuladores de exceção do controlador:
Notas finais:
extendMessageConverters
está disponível desde o Spring 4.1.3. Se estiver sendo executado em uma versão anterior, você poderá implementar a mesma técnica usandoconfigureMessageConverters
, apenas será necessário um pouco mais de trabalho.fonte
converters.removeIf(c -> c instanceof StringHttpMessageConverter)
Sei que esta pergunta é antiga, mas gostaria de contribuir também:
A principal diferença entre as outras respostas é o retorno do hashmap.
Isso retornará:
fonte
Faça simples:
fonte
Adicionar
produces = "application/json"
na@RequestMapping
anotação como:Dica: como valor de retorno, recomendo usar o
ResponseEntity<List<T>>
tipo. Como os dados produzidos no corpo JSON precisam ser uma matriz ou um objeto de acordo com suas especificações, em vez de um simples sequência . Às vezes, pode causar problemas (por exemplo, Observáveis no Angular2).Diferença:
retornou
String
como json:"example"
retornado
List<String>
como json:["example"]
fonte
Adicione
@ResponseBody
anotação, que gravará dados de retorno no fluxo de saída.fonte
@PostMapping(value = "/some-url", produces = APPLICATION_JSON_UTF8_VALUE)
Esse problema me deixou louco: o Spring é uma ferramenta tão potente e, no entanto, uma coisa tão simples como escrever uma String de saída como o JSON parece impossível sem hacks feios.
Minha solução (no Kotlin) que eu acho menos intrusiva e transparente é usar um conselho de controlador e verificar se a solicitação foi para um conjunto específico de pontos de extremidade (API REST normalmente, pois geralmente queremos retornar TODAS as respostas daqui como JSON e não faça especializações no front-end com base em se os dados retornados são uma sequência simples ("Não faça desserialização de JSON!") ou outra coisa ("Faça desserialização de JSON!")). O aspecto positivo disso é que o controlador permanece o mesmo e sem hacks.
O
supports
método garante que todas as solicitações que foram tratadas peloStringHttpMessageConverter
(por exemplo, o conversor que lida com a saída de todos os controladores que retornam strings simples) sejam processadas e, nobeforeBodyWrite
método, controlamos em quais casos queremos interromper e converter a saída em JSON (e modifique os cabeçalhos de acordo).Espero que, no futuro, recebamos uma anotação simples na qual possamos substituir o que
HttpMessageConverter
deve ser usado para a saída.fonte
Adicione esta anotação ao seu método
fonte