MEDIUMTEXT

Jackson 을 이용한 직렬화/역직렬화

tweak 2024. 11. 16. 23:45
반응형

Jackson을 사용하여 객체와 json간에 직렬화/역직렬화하는 방법을 알아보자.

 

먼저 직렬화와 역직렬화를 하는 방법은 Jackson말고도 Gson을 이용할 수도 있고, 방법은 아래 링크를 통해 확인 할 수 있다.

https://tweaklab.kr/entry/Gson%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%A7%81%EB%A0%AC%ED%99%94%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94-toJson-fromJson

 

Gson을 이용한 직렬화/역직렬화 (toJson / fromJson)

개발을 하다보면 json을 통해서 정보전달을 하는 경우가 많다.그 때 gson, jackson 등 여러가지가 library를 취향껏 사용하면 되는데, 본 글에서는 google에서 나온 gson을 이용한 object mapping을 설명하겠다

tweaklab.kr

 

라이브러리 추가

Jackson을 사용하기 위해서 의존성을 추가 한다.

 

현재 가장 최신 버전은 2.18.1 이다.

https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind/2.18.1

// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
implementation 'com.fasterxml.jackson.core:jackson-databind:2.18.1'

 

먼저 직렬화 역직렬화를 테스트 하기 위한 클래스를 생성한다.

import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.ArrayList;
import java.util.List;

public class Member {

    @JsonProperty("name")
    private String name;

    @JsonProperty("gender")
    private Gender gender;

    @JsonProperty("age")
    private int age;

    @JsonProperty("hobbies")
    private List<String> hobbies;

    protected Member() {
        this.age = 10;
        this.hobbies = new ArrayList<>();
    }

    @Override
    public String toString() {
        return "Member{" +
                "name='" + name + '\'' +
                ", gender=" + gender +
                ", age=" + age +
                ", hobbies=" + hobbies +
                '}';
    }
}

 

 

먼저 객체를 json으로 변경

    @Test
    void 객체를_Json으로_변환() throws JsonProcessingException {
        Member member = new Member();
        ObjectMapper mapper = new ObjectMapper();
        //member를 json으로 변환
        String json = mapper.writeValueAsString(member);
        System.out.println(json);
    }

 

결과는 아래와 같다.

{"name":null,"gender":null,"age":10,"hobbies":[]}

결과에서 알수 있듯이 기본생성자에서 지정한 age = 10과 hobbies의 빈 리스트가 그대로 json으로 변경되었다.

 

이제 반대로 json을 객체로 변경해보자

    void Json을_객체로_변환() throws JsonProcessingException {
        String json = "{\"name\":\"tweak\", \"age\":22}";
        ObjectMapper mapper = new ObjectMapper();
        Member member = mapper.readValue(json, Member.class);
        System.out.println(member);
    }

 

결과는 아래와 같다.

Member{name='tweak', gender=null, age=22, hobbies=[]}

아까는 결과가 json이라는 문자열이었지만 이번에는 객체이므로 객체의 toString()의 구현에 따라 결과가 출력된다.

 

위의 Member객체에는 name, age의 값일 지정해줄 생성자나 setter가 없었지만, 객체에는 해당 값이 저장된다.

이는 jackson 이 생성자나 setter가 없을 경우 reflection기능을 이용하기 때문에 그러하다.

만약 setter가 있다면, setter를 통해서 값을 저장한다.

 

요런 setter를 추가한다면?

    public void setAge(int age) {
        this.age = age + 1;
    }

 

결과는 이렇게 된다.

Member{name='tweak', gender=null, age=23, hobbies=[]}

 

자, 리스트는 어떻게 해야 할까? 리스트를 변환하기 위한 코드는 아래와 같다.

    void 목록을_객체로_변환() throws JsonProcessingException {
        List<Member> members = new ArrayList<>();
        members.add(new Member());
        members.add(new Member());

        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(members);
        System.out.println(json);
        List<Member> list = mapper.readValue(json, new TypeReference<List<Member>>() {});
        System.out.println(list);
    }

 

결과는 아래와 같다.

[{"name":null,"gender":null,"age":10,"hobbies":[]},{"name":null,"gender":null,"age":10,"hobbies":[]}]
[Member{name='null', gender=null, age=11, hobbies=[]}, Member{name='null', gender=null, age=11, hobbies=[]}]
반응형