Spring MVC - Comment retourner simple Chaîne JSON dans le Reste du Contrôleur
Ma question est essentiellement un suivi cette question.
@RestController
public class TestController
{
@RequestMapping("/getString")
public String getString()
{
return "Hello World";
}
}
Ci-dessus, le Printemps serait ajouter "Hello World" dans le corps de la réponse. Comment puis-je retourner une Chaîne de caractères comme une réponse JSON? Je comprends que je pourrais ajouter des guillemets, mais qui se sent plus comme un hack.
Veuillez fournir des exemples pour aider à expliquer ce concept.
Remarque: je ne veux pas de cet écrit directement pour le corps de la Réponse HTTP, je veux retourner à la Chaîne dans un format JSON (je suis avec mon Contrôleur
avec RestyGWT qui exige la réponse en JSON valide
format).
- Vous pouvez retourner la Carte ou n'importe quel objet/entité qui contiennent votre chaîne
- Donc vous voulez dire que vous voulez la Chaîne de valeur sérialisée à une chaîne JSON?
Vous devez vous connecter pour publier un commentaire.
Soit de retour
text/plain
(comme dans Retour seul message de la chaîne de Spring MVC 3 Contrôleur) OU de la pellicule de votre Chaîne de caractères est un objetDéfinissez votre type de réponse à
MediaType.APPLICATION_JSON_VALUE
(="application/json"
)et vous aurez un JSON qui ressemble à
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")
Collections.singleton("abc")
devient["abc"]
. J'ai testé cette.JSON est essentiellement une Chaîne de caractères en PHP ou JAVA contexte. Cela signifie que la chaîne qui est JSON valide peut être retourné dans la réponse. Suivant devrait fonctionner.
C'est bien pour la simple chaîne de réponse. Mais pour des complexes de réponse JSON vous devez utiliser la classe wrapper comme décrit par Shaun.
Dans un projet, nous avons abordé cette aide JSONObject (maven la dépendance info). Nous avons choisi ce parce que nous avons préféré retourner une simple Chaîne de caractères plutôt qu'un objet wrapper. Interne d'une classe d'assistance pourrait facilement être utilisé à la place si vous ne voulez pas d'ajouter une nouvelle dépendance.
Exemple D'Utilisation:
"\"Hello World\""
fonctionnerait tout aussi bien w/o supplémentaires dependendy - c'est ce queJSONObject.quote()
ne, droite?Vous pouvez facilement retourner
JSON
avecString
en propriétéresponse
comme suitSimplement annuler l'inscription de la valeur par défaut
StringHttpMessageConverter
exemple:Testé avec contrôleur d'action des méthodes de gestionnaire et de contrôleur des gestionnaires d'exception:
Notes finales:
extendMessageConverters
est disponible depuis le Printemps 4.1.3, si en cours d'exécution sur une version précédente, vous pouvez appliquer la même technique à l'aide deconfigureMessageConverters
, il faut juste un peu plus de travail.converters.removeIf(c -> c instanceof StringHttpMessageConverter)
Je sais que cette question est vieux, mais je voudrais aussi apporter leur contribution:
La principale différence entre les autres réponses est la table de hachage de retour.
Ce sera de retour:
Ajouter
produces = "application/json"
dans@RequestMapping
annotation comme:Conseil: en tant Que valeur de retour, je vous recommande d'utiliser
ResponseEntity<List<T>>
type. Parce que le produit des données en JSON corps à besoin d'être un tableau ou un objet selon son cahier des charges, plutôt que d'une simple et unique chaîne. Il peut causer des problèmes parfois (par exemple, les phénomènes Observables dans les Angular2).Différence:
retourné
String
json:"example"
retourné
List<String>
json:["example"]
Ajouter
@ResponseBody
annotation, qui écrira de renvoyer les données dans le flux de sortie.@PostMapping(value = "/some-url", produces = APPLICATION_JSON_UTF8_VALUE)
Dans spring MVC 4 le type de réponse par défaut pour les objets JSON. Donc tout ce que vous devez faire est d'envelopper votre Chaîne de caractères dans un Objet.
Pas de modifications pour le contrôleur, à l'exception de retour de la
StringResponse
au lieu de la Chaîne.Faire simple:
Ajouter cette annotation à votre méthode