Meine Frage ist im Wesentlichen eine Fortsetzung dieser Frage.
@RestController
public class TestController
{
@RequestMapping("/getString")
public String getString()
{
return "Hello World";
}
}
Oben würde Spring "Hello World" zum Antworttext hinzufügen. Wie kann ich einen String als JSON-Antwort zurückgeben? Ich verstehe, dass ich Zitate hinzufügen könnte, aber das fühlt sich eher wie ein Hack an.
Bitte geben Sie Beispiele an, um dieses Konzept zu erläutern.
Hinweis: Ich möchte nicht, dass dies direkt in den HTTP-Antworttext geschrieben wird. Ich möchte den String im JSON-Format zurückgeben (ich verwende meinen Controller mit RestyGWT, für den die Antwort im gültigen JSON-Format vorliegen muss).
Antworten:
Entweder return
text/plain
(wie in Nur String-Nachricht von Spring MVC 3 Controller zurückgeben ) oder Wrap Ihr String ist ein ObjektSetzen Sie Ihren Antworttyp auf
MediaType.APPLICATION_JSON_VALUE
(="application/json"
)und Sie haben einen JSON, der aussieht wie
quelle
Collections.singletonMap("response", "your string value")
, um dasselbe Ergebnis zu erzielen, ohne eine Wrapper-Klasse erstellen zu müssen.Collections.singleton("your string value")
JSON ist im Wesentlichen ein String im PHP- oder JAVA-Kontext. Dies bedeutet, dass eine gültige JSON-Zeichenfolge als Antwort zurückgegeben werden kann. Folgendes sollte funktionieren.
Dies ist für eine einfache Zeichenfolgenantwort in Ordnung. Für komplexe JSON-Antworten sollten Sie jedoch die von Shaun beschriebene Wrapper-Klasse verwenden.
quelle
In einem Projekt haben wir dies mit JSONObject (Maven Dependency Info ) behoben . Wir haben uns dafür entschieden, weil wir lieber einen einfachen String als ein Wrapper-Objekt zurückgegeben haben. Stattdessen kann problemlos eine interne Hilfsklasse verwendet werden, wenn Sie keine neue Abhängigkeit hinzufügen möchten.
Anwendungsbeispiel:
quelle
"\"Hello World\""
dies ohne die zusätzliche Abhängigkeit genauso gut funktionieren würde - genau dasJSONObject.quote()
tut es, richtig?Sie können
JSON
mitString
in Eigenschaftresponse
wie folgt einfach zurückkehrenquelle
Heben Sie einfach die Registrierung der Standardinstanz auf
StringHttpMessageConverter
:Getestet mit Controller Action Handler-Methoden und Controller Exception Handlern:
Schlussbemerkungen:
extendMessageConverters
ist seit Spring 4.1.3 verfügbar. Wenn Sie eine frühere Version verwenden, mit der Sie dieselbe Technik implementieren könnenconfigureMessageConverters
, ist nur ein wenig mehr Arbeit erforderlich .quelle
converters.removeIf(c -> c instanceof StringHttpMessageConverter)
Ich weiß, dass diese Frage alt ist, aber ich möchte auch dazu beitragen:
Der Hauptunterschied zwischen anderen Antworten ist die Hashmap-Rückgabe.
Dies wird zurückkehren:
quelle
Machen Sie es einfach:
quelle
Fügen Sie
produces = "application/json"
in@RequestMapping
Anmerkung wie:Hinweis: Als Rückgabewert empfehle ich die Verwendung von
ResponseEntity<List<T>>
type. Weil die erzeugten Daten im JSON-Body ein Array oder ein Objekt gemäß seinen Spezifikationen sein müssen und nicht eine einzelne einfache Zeichenfolge . Dies kann manchmal zu Problemen führen (z. B. Observables in Angular2).Unterschied:
zurückgegeben
String
als json:"example"
zurückgegeben
List<String>
als json:["example"]
quelle
Fügen Sie eine
@ResponseBody
Anmerkung hinzu, die Rückgabedaten in den Ausgabestream schreibt.quelle
@PostMapping(value = "/some-url", produces = APPLICATION_JSON_UTF8_VALUE)
Dieses Problem hat mich verrückt gemacht: Spring ist ein so mächtiges Werkzeug und doch scheint eine so einfache Sache wie das Schreiben eines Ausgabe-Strings wie JSON ohne hässliche Hacks unmöglich.
Meine Lösung (in Kotlin), die ich am wenigsten aufdringlich und am transparentesten finde, besteht darin, einen Controller-Rat zu verwenden und zu überprüfen, ob die Anforderung an einen bestimmten Satz von Endpunkten gesendet wurde (REST-API normalerweise, da wir von hier aus am häufigsten ALLE Antworten als JSON zurückgeben möchten und machen Sie keine Spezialisierungen im Frontend, basierend darauf, ob die zurückgegebenen Daten eine einfache Zeichenfolge ("JSON-Deserialisierung nicht durchführen!") oder etwas anderes ("JSON-Deserialisierung durchführen!") sind. Der positive Aspekt dabei ist, dass der Controller derselbe und ohne Hacks bleibt.
Das
supports
Methode stellt sicher, dass alle Anforderungen, die vom verarbeitet wurdenStringHttpMessageConverter
(z. B. der Konverter, der die Ausgabe aller Controller verarbeitet, die einfache Zeichenfolgen zurückgeben), verarbeitet werden. In derbeforeBodyWrite
Methode steuern wir, in welchen Fällen wir die Ausgabe unterbrechen und in JSON konvertieren möchten (und ändern Sie die Header entsprechend).Ich hoffe, dass wir in Zukunft eine einfache Anmerkung erhalten, in der wir überschreiben können, welche
HttpMessageConverter
für die Ausgabe verwendet werden soll.quelle
Fügen Sie diese Anmerkung Ihrer Methode hinzu
quelle