JSON 예시
//JSON(JavaScript Object Name) 예시
{
"name":"유관순",
"birthday":"1902-12-16",
"age":17,
"related":["남동순","류예도"]
"edu":[
{
"title":"이화학당보통과",
"year":1916
},
{
"title":"이화학당고등과",
"year":1916
},
{
"title":"이화학당고등과",
"year":1916
}
]
}
중괄호로 객체 표현.
객체는 (이름, 값) 쌍을 가지며, 콜론으로 구분.
배열은 대괄호 & 불린은 true, false로 표현.
related배열은 문자열 값 목록을, edu배열은 객체를 값목록으로 가짐.
JSON형식 문자열 간 변환은 Jackson 라이브러리를 통해 변환.
스프링 MVC에서, Jackson 라이브러리를 이용해 자바객체를 JSON으로 변환 가능(BY Jackson 라이브러리 추가)
이를 통해,
public class Person {
private String name;
private int age;
...get, set메서드
}
는
{
"name":"이름",
"age":10
}
등으로 변환이 됨.
스프링 MVC에서 JSON형식으로 데이터를 응답하는 것은,
@Controller 애노테이션 대신 @RestController 을 사용하면 됨.
기존 컨트롤러 클래스에서, @Controller을 @RestController로 변경하고,
요청 매핑 애노테이션 적용 메서드의 리턴타입을 일반 객체로 변경하면 된다.
이후, 크롬 브라우저에 json-formatter을 설치 후 결과를 보면 JSON데이터확인이 가능.
-------
날짜형식을 변환할 모든 대상에 @JsonFormat을 붙이는 건 비효율적.
Jackson의 변환규칙을 모든 날짜 타입에 적용하면 된다.
스프링MVC는 자바객체를 http응답으로 변환할 때, HttpMessageConverter을 사용. 가령 Jackson을 이용해 자바객체를 JSON으로 변환할 때는 MappingJackson2HttpMessageConverter을 쓴다.
@Override
//HttpMessageConverter을 추가로 설정할때 쓰는 extendMessageConverters
//@EnalbeWebMvc를 사용시, 스프링MVC는 여러 형식으로 변환할 수 있는 HttpMessageConverter을 미리 등록
//extendMessageConverters()는, 등록된 HttpMessageConverter목록을 파라미터로 받음
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
/* JSON으로 변환할 때 사용할 ObjectMapper생성.
* featuresToDisables을 통해, Jackson이 날짜형식을 '유닉스타임스탬프'로 출력하는 기능 비활성화
* ISO-8601형식으로 출력
*
* 새로생성한 OBjcetMapper을 쓰는 MappingJackson2HttpMessageConverter객체를
* converters의 첫번째 항목으로 등록시키면 끝남.
* 이를 추가시, Member 클래스에 적용한 @JsonFormat코드를 삭제해도, ISO-8601형식으로 날짜가 출력
*/
ObjectMapper objectMapper= Jackson2ObjectMapperBuilder.json().
featuresToDisable
(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).build();
//미리 등록된 HttpMessageConverter엔 Jackson이용도 포함돼있기에, 새로 생성한
//HttpMessageConverter은 목록에 제일 앞에 위치시켜 가장먼저 적용시켜야 함.
converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper));
}
@Override
//HttpMessageConverter을 추가로 설정할때 쓰는 extendMessageConverters
//@EnalbeWebMvc를 사용시, 스프링MVC는 여러 형식으로 변환할 수 있는 HttpMessageConverter을 미리 등록
//extendMessageConverters()는, 등록된 HttpMessageConverter목록을 파라미터로 받음
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
/* JSON으로 변환할 때 사용할 ObjectMapper생성.
* featuresToDisables을 통해, Jackson이 날짜형식을 '유닉스타임스탬프'로 출력하는 기능 비활성화
* ISO-8601형식으로 출력
*
* 새로생성한 OBjcetMapper을 쓰는 MappingJackson2HttpMessageConverter객체를
* converters의 첫번째 항목으로 등록시키면 끝남.
* 이를 추가시, Member 클래스에 적용한 @JsonFormat코드를 삭제해도, ISO-8601형식으로 날짜가 출력
*/
ObjectMapper objectMapper= Jackson2ObjectMapperBuilder.json().
simpleDataFormat("yyyyMMddHHmmss").build();
//미리 등록된 HttpMessageConverter엔 Jackson이용도 포함돼있기에, 새로 생성한
//HttpMessageConverter은 목록에 제일 앞에 위치시켜 가장먼저 적용시켜야 함.
converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper));
}
featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)를
simpleDataFormat("yyyyMMddHHmmss")로 변경하여 원하는 형식으로의 출력도 가능.
Jackson2ObjectMapperBuilder.simpleDateFormat()으로 Date타입 변환시 사용할 패턴을 지정해도,
LocalDateTime타입 변환에는 해당 패턴을 쓰지 않음.
대신 LocalDateTime타입은 ISO-8601형식으로 변환.
만일 모든 LocalDateTime 타입에 대해 원하는 패턴으로 설정을 하고자 한다면, serializerByType()을 이용,
LocalDateTime타입에 대한 JsonSerializer을 설정하면 됨.
ObjectMapper objectMapper= Jackson2ObjectMapperBuilder.json().
serializerByType(LocalDateTime.class, new
LocalDateTimeSerializer(formatter)).build();
@Override
//HttpMessageConverter을 추가로 설정할때 쓰는 extendMessageConverters
//@EnalbeWebMvc를 사용시, 스프링MVC는 여러 형식으로 변환할 수 있는 HttpMessageConverter을 미리 등록
//extendMessageConverters()는, 등록된 HttpMessageConverter목록을 파라미터로 받음
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
/* JSON으로 변환할 때 사용할 ObjectMapper생성.
* featuresToDisables을 통해, Jackson이 날짜형식을 '유닉스타임스탬프'로 출력하는 기능 비활성화
* ISO-8601형식으로 출력
*
* 새로생성한 OBjcetMapper을 쓰는 MappingJackson2HttpMessageConverter객체를
* converters의 첫번째 항목으로 등록시키면 끝남.
* 이를 추가시, Member 클래스에 적용한 @JsonFormat코드를 삭제해도, ISO-8601형식으로 날짜가 출력
*/
ObjectMapper objectMapper= Jackson2ObjectMapperBuilder.json().
serializerByType(LocalDateTime.class, new
LocalDateTimeSerializer(formatter)).build();
//미리 등록된 HttpMessageConverter엔 Jackson이용도 포함돼있기에, 새로 생성한
//HttpMessageConverter은 목록에 제일 앞에 위치시켜 가장먼저 적용시켜야 함.
converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper));
}