ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [java]ObjectMapper를 응용해 json형태(+jsonArray)형태를 원하는 타입(혹은 클래스)형식으로 변환하기
    프로그래밍 언어/자바 & 코틀린 2018. 3. 5. 15:38

    json 데이터로 넘어온 파라미터를 DTO의 형태에 넣고 싶었다.


    ObjectMapper를 사용하면 json데이터를 내가 원하는 형으로 바꿀 수 있었다. 


    먼저, DTO


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public 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}



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
        public 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}]}


    1
    2
    3
    4
    5
    6
    7
    8
    @Override
        public 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





Designed by Tistory.