-
[java]ObjectMapper를 응용해 json형태(+jsonArray)형태를 원하는 타입(혹은 클래스)형식으로 변환하기프로그래밍 언어/자바 & 코틀린 2018. 3. 5. 15:38
json 데이터로 넘어온 파라미터를 DTO의 형태에 넣고 싶었다.
ObjectMapper를 사용하면 json데이터를 내가 원하는 형으로 바꿀 수 있었다.
먼저, DTO
123456789101112public class TestDTO {private int orderSeq; //신청순번private String groupSeq; //그룹시퀀스private String compSeq; //회사시퀀스private String deptSeq; //부서시퀀스private String empSeq; //사용자시퀀스private String resignYn; //퇴직여부//getter, setter 생략//toString 생략}cs 넘어온 파라미터를 형변환 하는 방식이다.
json형식
{orderSeq : 1, groupSeq : 100, compSeq : 1000, deptSeq : 1012, empSeq : 132, resignYn : N}
12345678910@Overridepublic Map<String, Object> insertData (Map<String, Object> params) throws Exception {Map<String, Object> result = new HashMap<>();ObjectMapper mapper = new ObjectMapper();mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //파라미터Map에서 DTO에 들어있지 않는 변수가 있어도 무시함.testDTO testDto = mapper.convertValue(params.get("testDto"), testDTO.class); //형변환}cs ObjectMapper를 선언한다.
만약 mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)이 방법을 선언하지 않으면,
DTO에 있는 변수들(DB에서 컬럼으로 쓰일 변수)과 넘어오는 파라미터들간의 변수가 매핑되지 않는 부분이 있다면 에러가 발생한다.
mapper.convertValue(변환 전 값, 변환 후 클래스)를 사용하면 json으로 넘어온 데이터들이
선언한 testDto로 값이 들어간다.
그러나!
jsonArray로 넘어오는 경우에는 다른 방식으로 처리해야한다.
jsonArray형식 :
{testDtoList : [{orderSeq : 1, groupSeq : 100, compSeq : 1000, deptSeq : 1012, empSeq : 132, resignYn : N},
{orderSeq : 2, groupSeq : 100, compSeq : 1000, deptSeq : 2000, empSeq : 2012, resignYn : Y}]}
12345678@Overridepublic Map<String, Object> insertData (Map<String, Object> params) throws Exception {ObjectMapper mapper = new ObjectMapper();mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //파라미터Map에서 DTO에 들어있지 않는 변수가 있어도 무시함.List<testDTO> testDtoList =mapper.convertValue(params.get("testDtoList"), TypeFactory.defaultInstance().constructCollectionType(List.class, testDTO.class));cs mapper.convertValue를 사용하는 것까지는 맞지만,
jsonArray를 또 List형식으로 변환해주어야한다.
위에 설명했던 json형식을 바꾸는 방식으로 List클래스에 담으려면 에러가 난다.
TypeFactory.defaultInstance().constructCollectionType(List.class, testDTO.class)
TypeFactory.defaultInstance().constructCollectionType(변환하고자 하는 collectionClass, 들어갈 elementClass)
식으로 사용하는 것 같다.
*TypeFactory 설명 및 해석(셀프로 해석)
Class used for creating concrete
JavaType
instances, given various inputs.주어진 삽입 값을 구체적인 자바타입(형)으로 만드는 클래스.
*TypeFactory.defaultInstance()
Method used to access the globally shared instance, which has no custom configuration. Used by
ObjectMapper
to get the default factory when constructed.맞춤화되지 않은 전역 인스턴스에 접근하기 위한 메서드이다. OjbectMapper에서 구성된 기본 객체를 얻을 때 사용한다.
*TypeFactory.defaultInstance().constructCollectionType()
Method for constructing a
CollectionType
.NOTE: type modifiers are NOT called on Collection type itself; but are called for contained types.
타입을 구성하기 위한 CollectionType
'프로그래밍 언어 > 자바 & 코틀린' 카테고리의 다른 글
마우스 커서가 자동으로 이동하는 프로그램(다운로드) (0) 2018.07.19 [java]String.join 사용기(java8에만 존재하는 메서드) (0) 2018.03.12 [JSP] form태그 이용해서 데이터 주고 받기 (0) 2018.03.03 Exception 발생해도 원하는 파라미터 return하는 방법 (0) 2018.02.25 서버에서 json형태로 return하는 방법. (1) 2018.01.21