ObjectMapper의 동작방식

지환·2024년 7월 23일

Json

목록 보기
3/3

📌 해당 글은 필자가 개인공부한 글입니다. 저작권 및 내용에 문제가 있으면 댓글남겨주세요!

이번 시간에는 Spring에서 사용되는 ObjectMapper 동작 방식에 대해 정리 해보겠다.

ObjectMapper를 이용한 "직렬화(Serialize)"

객체 -> Json문자열

대표적인 메소드 : writeValueAsString()

writeValueAsString(value) : value(String 타입으로 변환할 대상)

map 타입 -> JSON 형식문자열로으로 변환해보자.

[map]


public class Json1 {
    public static void main(String[] args){
        ObjectMapper mapper = new ObjectMapper();
        Map<String,String> map = new HashMap<>();
        map.put("name","jihwan");
        map.put("age","28");
        map.put("email","ohjihwan123@naver.com");
        System.out.println("map =>"+ map);
        System.out.println("================");
        try {
            String jsonStr = mapper.writeValueAsString(map);
            System.out.println("jsonStr =>" + jsonStr);
        }catch(Exception e) {
            e.printStackTrace();
        }

    }
}

map => {name=jihwan, age=28, email=ohjihwan123@naver.com}
================================================================
jsonStr => {"name":"jihwan","age":"28","email":"ohjihwan123@naver.com"}

map에 담은 값 -> Json 문자열로 변환했다.


[리스트 직렬화]


public class ListJson {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        List<String> list = Arrays.asList("jihwan","dydgus","wltn"); // asList를 사용하면 얕은복사로 복사된다.
        try {
            String jsonStr = mapper.writeValueAsString(list);
            System.out.println(jsonStr);
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        
    }
    
}

[복잡한 데이터 구조 직렬화]

public class difficultList {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        Map<String,Object> complexmap = new HashMap<>();
        complexmap.put("name", "jihwan");
        complexmap.put("age", 28);
        complexmap.put("email", "ohjihwan123@naver.com");
        complexmap.put("hobbies", List.of("reading","travel","swimming"));
        try {
            String jsonStr = mapper.writeValueAsString(complexmap);
            System.out.println(jsonStr);
        //{"hobbies":["reading","travel","swimming"],"name":"jihwan","age":28,"email":"ohjihwan123@naver.com"}
        }catch(Exception e){
            e.printStackTrace();
        }

    }
}

ObjectMapper를 이용한 "역직렬화(Deserialize)"

Json 문자열 -> 객체를 만들어냄.

대표적인 메소드 : readvalue()

readValue(arg,type)

- arg : 지정된 타입으로 변환할 대상

- type : 대상을 어떤 타입으로 변환할 것인지 클래스를 명시

(Class객체/TypeReference객체가 올 수 있음)

[예시]

mapper.readValue(arg, ArrayList.class);
mapper.readValue(arg, new ArrayList<HashMap<String,String>>().getClass());
mapper.readValue(arg, new TypeReference<ArrayList<HashMap<String,String>>>(){});

Json 문자열을 ---> 맵 타입으로 변환해보자.

[JSON -> Map]

public class jsonMap {
    public static void main(String[] args) {
        ObjectMapper mapper = new ObjectMapper();
        Map<String,String> map = new HashMap<>();
        String json = "{\"name\":\"ohjihwan\",\"age\":28,\"gender\":\"M\"}";
        try{
            map = mapper.readValue(json,
            new TypeReference<HashMap<String, String>>() {});
            System.out.println(map);
            // {gender=M, name=ohjihwan, age=28}
        }
        catch(Exception e){
            e.printStackTrace();
        }

    }
}

[List]

public class listMapchange {
    public static void main(String[] args) {
        // Object -> Json으로 변환
        try{
            ObjectMapper mapper = new ObjectMapper();
            ArrayList<HashMap<String,String>> list = new ArrayList<HashMap<String,String>>();
            HashMap<String,String> map = new HashMap<>();
    
            map.put("name","jihwan");
            map.put("age", "28");
            map.put("email","ohjihwan123@naver.com");
            list.add(map);
    
            map = new HashMap<>(); 
            map.put("name","dydgus");
            map.put("age", "27");
            map.put("email","ohjihwan@naver.com");
    
            list.add(map);
            System.out.println(mapper.writeValueAsString(list));
// [{"name":"jihwan","age":"28","email":"ohjihwan123@naver.com"},{"name":"dydgus","age":"27","email":"ohjihwan@naver.com"}]
            // Json -> Object
            String jsonStr = mapper.writeValueAsString(list);
            list = mapper.readValue(jsonStr, new TypeReference<ArrayList<HashMap<String,String>>>() {});
            System.out.println(list);
// [{name=jihwan, age=28, email=ohjihwan123@naver.com}, {name=dydgus, age=27, email=ohjihwan@naver.com}]
            
        }
        catch(Exception e) {
            e.printStackTrace();
        }


    }
    
}

참고 | https://engaspect.tistory.com/27

https://mangkyu.tistory.com/223

profile
아는만큼보인다.

0개의 댓글