Moje pytanie jest zasadniczo kontynuacją tego pytania.
@RestController
public class TestController
{
@RequestMapping("/getString")
public String getString()
{
return "Hello World";
}
}
W powyższym przykładzie Spring dodałby „Hello World” do treści odpowiedzi. Jak mogę zwrócić ciąg jako odpowiedź JSON? Rozumiem, że mógłbym dodawać cytaty, ale to bardziej przypomina hack.
Proszę podać przykłady, które pomogą wyjaśnić tę koncepcję.
Uwaga: nie chcę, aby było to zapisywane bezpośrednio w treści odpowiedzi HTTP, chcę zwrócić ciąg w formacie JSON (używam kontrolera z RestyGWT, który wymaga odpowiedzi w prawidłowym formacie JSON).
Odpowiedzi:
Albo zwróć
text/plain
(jak w Zwróć tylko wiadomość tekstową z kontrolera Spring MVC 3 ) LUB zawiń Twój String to jakiś obiektUstaw typ odpowiedzi na
MediaType.APPLICATION_JSON_VALUE
(="application/json"
)i będziesz mieć JSON, który wygląda jak
źródło
Collections.singletonMap("response", "your string value")
aby osiągnąć ten sam wynik bez konieczności tworzenia klasy opakowania.Collections.singleton("your string value")
JSON jest zasadniczo ciągiem znaków w kontekście PHP lub JAVA. Oznacza to, że w odpowiedzi można zwrócić ciąg, który jest prawidłowym kodem JSON. Następujące powinno działać.
Jest to w porządku w przypadku prostej odpowiedzi typu string. Ale dla złożonej odpowiedzi JSON powinieneś użyć klasy opakowującej opisanej przez Shauna.
źródło
W jednym projekcie rozwiązaliśmy ten problem za pomocą JSONObject ( informacje o zależnościach maven ). Wybraliśmy to, ponieważ woleliśmy zwrócić prosty łańcuch zamiast obiektu opakowującego. Zamiast tego można łatwo użyć wewnętrznej klasy pomocniczej, jeśli nie chcesz dodawać nowej zależności.
Przykładowe zastosowanie:
źródło
"\"Hello World\""
działałoby to równie dobrze bez dodatkowej zależności - to właśnieJSONObject.quote()
działa, prawda?Możesz łatwo wrócić
JSON
zString
własnościąresponse
w następujący sposóbźródło
Po prostu wyrejestruj domyślną
StringHttpMessageConverter
instancję:Przetestowano zarówno z metodami obsługi akcji kontrolera, jak i programami obsługi wyjątków kontrolera:
Uwagi końcowe:
extendMessageConverters
jest dostępny od Spring 4.1.3, jeśli korzystasz z poprzedniej wersji, możesz zaimplementować tę samą technikę, używającconfigureMessageConverters
tylko trochę więcej pracy.źródło
converters.removeIf(c -> c instanceof StringHttpMessageConverter)
Wiem, że to pytanie jest stare, ale chciałbym również wnieść swój wkład:
Główną różnicą między innymi odpowiedziami jest zwrot hashmap.
To zwróci:
źródło
Uprość:
źródło
Dodaj
produces = "application/json"
w@RequestMapping
adnotacji, takich jak:Podpowiedź: Jako wartość zwracaną polecam użycie
ResponseEntity<List<T>>
typu. Ponieważ dane wygenerowane w treści JSON muszą być tablicą lub obiektem zgodnie ze specyfikacjami, a nie pojedynczym prostym ciągiem . Czasami może powodować problemy (np. Observables w Angular2).Różnica:
zwrócony
String
jako json:"example"
zwrócony
List<String>
jako json:["example"]
źródło
Dodaj
@ResponseBody
adnotację, która zapisze zwracane dane w strumieniu wyjściowym.źródło
@PostMapping(value = "/some-url", produces = APPLICATION_JSON_UTF8_VALUE)
Ten problem doprowadził mnie do szaleństwa: Spring jest tak potężnym narzędziem, a jednak tak prosta rzecz, jak napisanie wyjściowego ciągu znaków jako JSON, wydaje się niemożliwa bez brzydkich hacków.
Moim rozwiązaniem (w Kotlinie), które uważam za najmniej inwazyjne i najbardziej przejrzyste, jest skorzystanie z porady kontrolera i sprawdzenie, czy żądanie trafiło do określonego zestawu punktów końcowych (zazwyczaj REST API, ponieważ najczęściej chcemy zwrócić WSZYSTKIE odpowiedzi stąd jako JSON i nie twórz specjalizacji w interfejsie użytkownika na podstawie tego, czy zwracane dane są zwykłym ciągiem znaków („Nie wykonuj deserializacji JSON!”), czy czymś innym („Wykonaj deserializację JSON!”)). Pozytywnym aspektem jest to, że kontroler pozostaje ten sam i bez hacków.
supports
Metoda zapewnia, że wszystkie wnioski, które były obsługiwane przezStringHttpMessageConverter
(np konwerter, który obsługuje wyjście wszystkich sterowników, które zwracają zwykłe struny) są przetwarzane oraz wbeforeBodyWrite
metodzie możemy kontrolować, w jakich przypadkach chcemy przerwać i konwertować dane wyjściowe do JSON (i odpowiednio zmodyfikuj nagłówki).Mam nadzieję, że w przyszłości otrzymamy prostą adnotację, w której będziemy mogli nadpisać, która
HttpMessageConverter
powinna być użyta do wyniku.źródło
Dodaj tę adnotację do swojej metody
źródło