동방프로젝트

JSON 예시

두원공대88학번뚜뚜 2021. 2. 9. 19:20
//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));
	}