코틀린 개발을 하던 중에 Jackson에서 제공하는 ObjectMapper를 마주쳤습니다.대략적으로 JSON을 자바 객체로 변환해주거나 그 반대로 처리를 해주는 것으로 알고 있는데, 개념이 명확하게 정리되지 않아, 이번 기회에 정리를 해보려고 합니다.
1. 개요
Jackson ObjectMapper는 JSON 데이터 -> JAVA 객체로 변환하거나 그 반대로 변환하는 라이브러리 입니다. 대부분의 자바 기반의 웹 프레임워크에서 기본적으로 쓰고 있습니다. 특히 ObjectMapper는 Jackson JSON 라이브러리의 주요 구성 요소 중 하나로 JSON 데이터의 파싱과 생성을 위한 기능을 제공합니다. JSON 데이터를 읽어서 자바 객체로 변환하는 역직렬화(deserialization)와 Java 객체를 JSON 데이터로 변환하는 직렬화(serialization) 기능을 지원합니다.
2. Jackson ObejctMapper 의존성 추가하기(Maven, Gradle)
2.1 Maven
아래 종속성을 pom.xml의 <dependencies> 부분에 추가해줍니다.
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.*.*</version>
</dependency>
2.2 Gradle
아래 종속성을 pom.xml의 <dependencies> 부분에 추가해줍니다.
// https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.3'
3. 기본 기능
아래 User라는 Java Object가 존재한다고 가정하겠습니다.
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
3.1. 직렬화(JAVA -> JSON)
아래 내용과 같이 user 객체를 생성한 후, objectMapper.writeValue()를 호출하여 Json 형태의 파일 객체를 만들거나 writeValueAsString()을 통해 문자열로 출력하는 것을 확인하실 수 있습니다.
ObjectMapper objectMapper = new ObjectMapper();
User user = new User("Ryan", 30);
objectMapper.writeValue(new File("user.json"), user);
// 파일 출력: user.json
{"name":"Ryan","age":30}
// 문자열 출력
String userAsString = objectMapper.writeValueAsString(user);
{"name":"Ryan","age":30}
3.2. 역직렬화(JSON -> JAVA)
역직렬화의 경우, write가 아닌, read를 통해 Json 데이터를 Java 객체로 변환하는 내용을 확인하실 수 있습니다.
// String to Object
String json = "{ \"name\" : \"Ryan\", \"age\" : 30 }";
User user = objectMapper.readValue(json, User.class);
// JSON File to Object
User user = objectMapper.readValue(new File("user.json"), User.class);
// JSON URL to Object
User user = objectMapper.readValue(new URL("file:user.json"), User.class);
3.3. JSON 배열 -> java list
String jsonArr = "[{\"name\":\"Ryan\",\"age\":30},{\"name\":\"Jake\",\"age\":20}]";
List<User> users = objectMapper.readValue(jsonArr, new TypeReference<>() {});
3.4. JSON String -> Java Map
String jsonArr = "{\"name\":\"Ryan\",\"age\":30}";
Map<String, Object> user = objectMapper.readValue(jsonArr, new TypeReference<>() {
});
--> { name=Ryan, age=30 }
4. 추가 기능 및 옵션
ObjectMapper 객체는 JSON 데이터의 직렬화(serialization) 및 역직렬화(deserialization) 작업 처리 시에 여러 문제에 직면하게 되는데, 아래와 같은 옵션을 통해 해결 할 수 있습니다.
4.1 configure 셋팅 값
- DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES : 알려지지 않은 프로퍼티를 만났을 때, ObjectMapper는 예외를 발생시킵니다. 이 설정을 false로 하면 알려지지 않은 프로퍼티를 무시합니다.
- DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE : 알려지지 않은 열거형(enum) 값이 있을 때, ObjectMapper는 열거형의 기본(default) 값을 사용합니다.
- JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature() : JSON 문자열에서 이스케이프(escape) 처리되지 않은 제어 문자(control character)를 허용합니다.
4.2 enable / disable 셋팅 값
- SerializationFeature.WRITE_DATES_AS_TIMESTAMPS : 날짜를 타임스탬프로 출력하지 않고, ISO 8601 형식의 문자열로 출력합니다.
- SerializationFeature.WRITE_ENUMS_USING_TO_STRING : 열거형(enum)을 문자열로 출력합니다.
'IT' 카테고리의 다른 글
Spring Data JPA - 데이터 뻥튀기 (일대다 관계 조인) (0) | 2023.03.14 |
---|---|
코틀린에서 reified를 사용하는 이유 (0) | 2023.03.13 |
엘지 유플러스 공유기 PC 원격 실행 설정 방법(윈도우10, won)(23년 최신) (0) | 2023.03.06 |
New Bing AI에 대해서 알아보자. (1) | 2023.03.05 |
맥북 메모장 삭제된 내용 복구 방법(23년 최신) (0) | 2023.02.21 |
댓글