Мой вопрос по сути является продолжением этого вопроса.
@RestController
public class TestController
{
@RequestMapping("/getString")
public String getString()
{
return "Hello World";
}
}
Выше Spring добавил бы «Hello World» в тело ответа. Как я могу вернуть строку в качестве ответа JSON? Я понимаю, что могу добавить цитаты, но это больше похоже на взлом.
Пожалуйста, предоставьте любые примеры, которые помогут объяснить эту концепцию.
Примечание: я не хочу, чтобы это было записано прямо в тело ответа HTTP, я хочу вернуть строку в формате JSON (я использую мой контроллер с RestyGWT, который требует, чтобы ответ был в допустимом формате JSON).
Ответы:
Либо верните
text/plain
(как в Return только строковое сообщение из Spring MVC 3 Controller ) ИЛИ оберните вашу String каким-то объектомУстановите тип ответа
MediaType.APPLICATION_JSON_VALUE
(="application/json"
)и у вас будет JSON, который выглядит как
источник
Collections.singletonMap("response", "your string value")
для достижения того же результата, не создавая класс-оболочку.Collections.singleton("your string value")
JSON по сути является строкой в контексте PHP или JAVA. Это означает, что строка, которая является допустимой JSON, может быть возвращена в ответ. Следующее должно работать.
Это нормально для простого строкового ответа. Но для сложного ответа JSON вы должны использовать класс-оболочку, как описано Shaun.
источник
В одном проекте мы решили эту проблему с помощью JSONObject ( информация о зависимостях maven ). Мы выбрали это, потому что мы предпочитали возвращать простую строку, а не объект-оболочку. Вместо этого можно легко использовать внутренний вспомогательный класс, если вы не хотите добавлять новую зависимость.
Пример использования:
источник
"\"Hello World\""
будет работать так же хорошо, без дополнительной зависимости - это тоJSONObject.quote()
, что работает, верно?Вы можете легко вернуться
JSON
сString
в собственностиresponse
следующим образомисточник
Просто отмените регистрацию
StringHttpMessageConverter
экземпляра по умолчанию :Протестировано с использованием методов обработчика действий контроллера и обработчиков исключений контроллера:
Финальные заметки:
extendMessageConverters
доступен начиная с Spring 4.1.3, если вы работаете в предыдущей версии, вы можете реализовать ту же технику, используяconfigureMessageConverters
, это займет немного больше работы.источник
converters.removeIf(c -> c instanceof StringHttpMessageConverter)
Я знаю, что этот вопрос старый, но я бы тоже хотел внести свой вклад:
Основное различие между другими ответами - возвращение хэш-карты.
Это вернет:
источник
Сделай просто:
источник
Добавить
produces = "application/json"
в@RequestMapping
аннотации вроде:Подсказка: в качестве возвращаемого значения я рекомендую использовать
ResponseEntity<List<T>>
тип. Поскольку производимые данные в теле JSON должны быть массивом или объектом в соответствии с их спецификациями, а не одной простой строкой . Это может иногда вызывать проблемы (например, Observables в Angular2).Разница:
вернулся
String
как json:"example"
вернулся
List<String>
как json:["example"]
источник
Добавьте
@ResponseBody
аннотацию, которая будет записывать возвращаемые данные в выходной поток.источник
@PostMapping(value = "/some-url", produces = APPLICATION_JSON_UTF8_VALUE)
Эта проблема привела меня в бешенство: Spring - такой мощный инструмент, и все же такая простая вещь, как написание выходной строки в виде JSON, кажется невозможной без уродливых хаков.
Мое решение (в Kotlin), которое я считаю наименее навязчивым и наиболее прозрачным, состоит в том, чтобы использовать совет контроллера и проверить, был ли запрос направлен на определенный набор конечных точек (обычно REST API), поскольку мы чаще всего хотим возвращать ВСЕ ответы отсюда в виде JSON. и не создавать специализаций во внешнем интерфейсе, основываясь на том, являются ли возвращаемые данные простой строкой («Не выполнять десериализацию JSON!») или чем-то еще («Делать десериализацию JSON!»)). Положительным моментом этого является то, что контроллер остается прежним и без взломов.
supports
Метод гарантирует , что все запросы , которые были обработаны с помощьюStringHttpMessageConverter
(например , преобразователя , который обрабатывает выходные всех контроллеров , которые возвращают простые строки) обрабатываются и вbeforeBodyWrite
методе, мы контролируем , в каких случаях мы хотим прервать и преобразовать вывод в формат JSON (и измените заголовки соответственно).Я надеюсь, что в будущем мы получим простую аннотацию, в которой мы можем переопределить, которую
HttpMessageConverter
следует использовать для вывода.источник
Добавьте эту аннотацию к вашему методу
источник