Ma question fait essentiellement suite à cette question.
@RestController
public class TestController
{
@RequestMapping("/getString")
public String getString()
{
return "Hello World";
}
}
Dans ce qui précède, Spring ajouterait "Hello World" dans le corps de la réponse. Comment puis-je renvoyer une chaîne en tant que réponse JSON? Je comprends que je pourrais ajouter des citations, mais cela ressemble plus à un hack.
Veuillez fournir des exemples pour expliquer ce concept.
Remarque: je ne veux pas que cela soit écrit directement dans le corps de la réponse HTTP, je veux renvoyer la chaîne au format JSON (j'utilise mon contrôleur avec RestyGWT qui nécessite que la réponse soit au format JSON valide).
Réponses:
Soit return
text/plain
(comme dans Return only string message from Spring MVC 3 Controller ) OU envelopper votre String est un objetDéfinissez votre type de réponse sur
MediaType.APPLICATION_JSON_VALUE
(="application/json"
)et vous aurez un JSON qui ressemble à
la source
Collections.singletonMap("response", "your string value")
pour obtenir le même résultat sans avoir à créer une classe wrapper.Collections.singleton("your string value")
JSON est essentiellement une chaîne dans un contexte PHP ou JAVA. Cela signifie que la chaîne qui est valide JSON peut être retournée en réponse. La suite devrait fonctionner.
C'est correct pour une réponse de chaîne simple. Mais pour une réponse JSON complexe, vous devez utiliser la classe wrapper comme décrit par Shaun.
la source
Dans un projet, nous avons résolu ce problème en utilisant JSONObject ( maven dependency info ). Nous avons choisi cela car nous avons préféré renvoyer une chaîne simple plutôt qu'un objet wrapper. Une classe d'assistance interne pourrait facilement être utilisée à la place si vous ne souhaitez pas ajouter de nouvelle dépendance.
Exemple d'utilisation:
la source
"\"Hello World\""
cela fonctionnerait aussi bien sans la dépendance supplémentaire - c'est ce quiJSONObject.quote()
fonctionne, non?Vous pouvez facilement revenir
JSON
avecString
dans la propriétéresponse
comme suitla source
Désenregistrez simplement l'
StringHttpMessageConverter
instance par défaut :Testé avec les méthodes de gestionnaire d'action de contrôleur et les gestionnaires d'exception de contrôleur:
Notes finales:
extendMessageConverters
est disponible depuis le printemps 4.1.3, si vous utilisez une version précédente, vous pouvez implémenter la même technique en utilisantconfigureMessageConverters
, cela prend juste un peu plus de travail.la source
converters.removeIf(c -> c instanceof StringHttpMessageConverter)
Je sais que cette question est ancienne mais j'aimerais aussi contribuer:
La principale différence entre les autres réponses est le retour de hashmap.
Cela retournera:
la source
Faites simple:
la source
Ajouter
produces = "application/json"
dans l'@RequestMapping
annotation comme:Astuce: comme valeur de retour, je recommande d'utiliser le
ResponseEntity<List<T>>
type. Parce que les données produites dans le corps JSON doivent être un tableau ou un objet selon ses spécifications, plutôt qu'une simple chaîne simple . Cela peut parfois causer des problèmes (par exemple Observables dans Angular2).Différence:
renvoyé
String
comme json:"example"
renvoyé
List<String>
comme json:["example"]
la source
Ajoutez une
@ResponseBody
annotation, qui écrira les données de retour dans le flux de sortie.la source
@PostMapping(value = "/some-url", produces = APPLICATION_JSON_UTF8_VALUE)
Ce problème m'a rendu fou: Spring est un outil si puissant et pourtant, une chose aussi simple que d'écrire une chaîne de sortie en JSON semble impossible sans des hacks horribles.
Ma solution (dans Kotlin) que je trouve la moins intrusive et la plus transparente est d'utiliser un conseil de contrôleur et de vérifier si la requête est allée à un ensemble particulier de points de terminaison (API REST généralement car nous voulons le plus souvent renvoyer TOUTES les réponses d'ici au format JSON et ne pas faire de spécialisations dans le frontend en fonction du fait que les données renvoyées sont une chaîne simple ("Ne pas faire de désérialisation JSON!") ou autre chose ("Faire une désérialisation JSON!")). L'aspect positif de ceci est que le contrôleur reste le même et sans hacks.
La
supports
méthode s'assure que toutes les requêtes qui ont été traitées par leStringHttpMessageConverter
(par exemple le convertisseur qui gère la sortie de tous les contrôleurs qui renvoient des chaînes en clair) sont traitées et dans labeforeBodyWrite
méthode, nous contrôlons dans quels cas nous voulons interrompre et convertir la sortie en JSON (et modifiez les en-têtes en conséquence).J'espère qu'à l'avenir nous obtiendrons une annotation simple dans laquelle nous pourrons remplacer celle qui
HttpMessageConverter
devrait être utilisée pour la sortie.la source
Ajoutez cette annotation à votre méthode
la source