Jackson 을 이용한 직렬화/역직렬화
Jackson을 사용하여 객체와 json간에 직렬화/역직렬화하는 방법을 알아보자.
먼저 직렬화와 역직렬화를 하는 방법은 Jackson말고도 Gson을 이용할 수도 있고, 방법은 아래 링크를 통해 확인 할 수 있다.
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=[]}]