среда, 1 февраля 2017 г.

Spring MVC отформатированный JSON при помощи Jackson

При стандартных настройках объект Java сереализуется в неформатированный JSON в данной заметке описано, как перевести его в отфоматированный вид.

Допустим у нас имеется метод возвращающий состояния пользователей следующего вида

 @RequestMapping(value = "/UsersInfo", method = { RequestMethod.GET, RequestMethod.POST })
 @ResponseBody
 public Map<String,Map<String,String>> getUserInfo() {
  Map <String,Map<String,String>> usersInfo = new LinkedHashMap<String, Map<String,String>>(); 
  
  String user = "User 1";
  Map<String,String> userInfo = new LinkedHashMap<String,String>();
  userInfo.put("Name", "Ivan");
  userInfo.put("Status", "Active");
  usersInfo.put(user, userInfo);
  
  user = "User 2";
  userInfo = new LinkedHashMap<String,String>();
  userInfo.put("Name", "Vasya");
  userInfo.put("Status", "Passive");
  usersInfo.put(user, userInfo);
  
  return usersInfo;
 }

При доступе к нему из браузера http://localhost:8080/Test/UsersInfo при стандартных настройках вернется объект в таком виде:

{"User 1":{"Name":"Ivan","Status":"Active"},"User 2":{"Name":"Vasya","Status":"Passive"}}

Нам же для удобного просмотра требуется отформотировать этот ответ. Для этого создадим класс настроек WebAppConfig который будет расширять WebMvcConfigurerAdapter.
В новом классе переопределим метод configureMessageConverters таким образом:
@Configuration
@EnableWebMvc
@ComponentScan("ru.blogspot.codemonkeydeveloper")
public class WebAppConfig extends WebMvcConfigurerAdapter {
 
 @Override
 public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
     final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
     final ObjectMapper objectMapper = new ObjectMapper();
     objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
     converter.setObjectMapper(objectMapper);
     converters.add(converter);
     super.configureMessageConverters(converters);
 }
   
}

Сам вид устанавливается вот этой строкой 
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);

В результате получим желаемый вид

{
  "User 1" : {
    "Name" : "Ivan",
    "Status" : "Active"
  },
  "User 2" : {
    "Name" : "Vasya",
    "Status" : "Passive"
  }
}

Комментариев нет:

Отправить комментарий