Возвращение строки в формате JSON в Spring MVC Rest Controller

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

В Spring MVC, чтобы вернуть строку в формате JSON используя RestController, необходимо применить аннотации @RestController и @GetMapping, а также указать атрибут produces в качестве MediaType.APPLICATION_JSON_VALUE. Вот пример:

Java
Скопировать код
@RestController
public class SimpleController {

    @GetMapping(value = "/stringAsJson", produces = MediaType.APPLICATION_JSON_VALUE)
    public String getStringAsJson() {
        return "{\"message\":\"Привет, мир!\"}";
    }
}

Этот метод отвечает строкой в формате JSON по адресу /stringAsJson. Аннотация @RestController освобождает от необходимости дополнительного использования @ResponseBody.

Однако существует более изящное решение, оно избавляет от необходимости вручную формировать строки JSON. Давайте рассмотрим его подробно.

Кинга Идем в IT: пошаговый план для смены профессии

Лучшие практики возвращения строки в формате JSON

Запаковка строки в объект

Не нужно руками экранировать кавычки:

Java
Скопировать код
@RestController
public class ClassResponseController {

    @GetMapping("/classStringAsJson")
    public Response getMessage() {
        return new Response("Когда жизнь дарит тебе классы, создавай объекты.");
    }
    
    static class Response {
        private String message;
        
        public Response(String message) {
            this.message = message;
        }
        
        public String getMessage() {
            return message;
        }
    }
}

Использование ResponseEntity

ResponseEntity дает больше возможностей для управления:

Java
Скопировать код
@RestController
public class ResponseEntityController {

    @GetMapping("/responseEntityAsString")
    public ResponseEntity<String> getResponseEntityAsString() {
        return ResponseEntity.ok()
                             .contentType(MediaType.APPLICATION_JSON)
                             .body(JSONObject.quote("Когда жизнь дарит тебе лимоны, преврати их в JSON!"));
    }
}

Метод JSONObject.quote() обеспечивает правильное преобразование строки в валидный JSON.

Преобразование в JSON с использованием Collections.singletonMap

Этот метод идеально подходит для объектов JSON с одной парой ключ-значение:

Java
Скопировать код
@RestController
public class SingletonMapController {

    @GetMapping("/singletonMap")
    public Map<String, String> getSingletonMap() {
        return Collections.singletonMap("message", "Привет, одиночный мир!");
    }
}

Настройка обработчиков сообщений

Настройка обработчиков сообщений позволяет полностью контролировать преобразование JSON:

Java
Скопировать код
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        // Здесь можно настроить порядок использования конвертеров, например, отдавать предпочтение Jackson перед StringHttpMessageConverter
    }
}

Визуализация

Хотите получить JSON по аналогии с блюдом от шеф-повара? Используйте следующий код:

Java
Скопировать код
@RestController
public class MasterChefController {
    @GetMapping("/chickenTikka")
    public ResponseEntity<String> getChickenTikka() {
        return ResponseEntity.ok("{\"message\":\"Чикен Тикка\"}"); // Шеф подает прямо в JSON
    }
}

На выходе получаем:

Markdown
Скопировать код
Ответ: {"message":"Чикен Тикка"}

Это словно шеф-повар, который накормит вас блюдом, аккуратно упакованным в JSON.

Освоение искусства работы с JSON

Совместимость с RestyGWT

Если вы используете RestyGWT, убедитесь в том, что ваш JSON соответствует всем требованиям:

Java
Скопировать код
@GetMapping(value = "/restyGwtFriendly", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> getRestyGWTCompatibleString() {
    return ResponseEntity.ok(new JSONObject(Map.of("response", "С уважением к Rest(yGWT)!")));
}

Отладка – простое как кетчуп с фри

Logger станет вашим надежным инструментом при отладке:

Java
Скопировать код
private static final Logger logger = LoggerFactory.getLogger(YourController.class);

@GetMapping("/loggableStringAsJson")
public Map<String, String> getLoggableStringAsJson(HttpServletRequest request) {
    logger.info("Получен запрос от {}", request.getRemoteAddr());
    return Collections.singletonMap("response", "Запрос обработан! Привет, мир!");
}

Тонкая настройка обработки контента

Возведите договоренность о содержимом до уровня VIP:

Java
Скопировать код
@GetMapping("/negotiatedStringAsJson")
public ResponseEntity<String> getNegotiatedStringAsJson() {
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    return new ResponseEntity<>("{\"message\":\"Искусство переговоров в стиле JSON!\"}", headers, HttpStatus.OK);
}

Пользовательское преобразование в JSON

Выборочно настройте конвертеры для точного соответствия JSON:

Java
Скопировать код
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof StringHttpMessageConverter);
    // Здесь вы можете установить использование усиленного конвертера Jackson для обработки JSON
}

Полезные материалы

  1. Создание RESTful-веб-сервиса с использованием Spring Boot Actuator — руководство по созданию сервисов на основе Spring Boot и Actuator.
  2. Spring Boot – Возвращение JSON из RESTful-сервиса — практическая инструкция по созданию RESTful-сервиса, возвращающего JSON, в Spring Boot.
  3. Работа с данными из MySQL в Spring Boot — введение в работу с базой данных MySQL в приложениях Spring Boot.
  4. Примеры аннотаций Jackson — погружение в мир магии аннотаций Jackson в приложениях Spring.
  5. Тестирование структуры Spring MVC – Тестирование REST API — освоение техник тестирования REST API в контексте Spring MVC.
Свежие материалы