Backend/JAVA

ObjectMapper / JSON 파싱

dddzr 2022. 6. 6. 20:36

Object Mapper

 

1. 직렬화와 역직렬화

직렬화(Serialization)

Object -> String

자바 객체를 JSON 형식의 문자열로 변환하는 과정을 의미합니다. 이를 통해 객체의 데이터를 파일이나 네트워크를 통해 전송 가능한 문자열 형태로 변환합니다.

역직렬화(Deserialization)

String -> Object

JSON 형식의 문자열을 자바 객체로 변환하는 과정을 의미합니다. 이를 통해 JSON 형식으로 전달받은 데이터를 자바 객체로 활용할 수 있습니다.

 

2. Jackson 라이브러리

Jackson은 JSON 데이터와 자바 객체 간의 변환을 쉽게 처리할 수 있도록 도와주는 강력하고 인기 있는 라이브러리입니다. 자바 개체의 직렬화 및 역직렬화를 처리하는 데 특화되어 있으며, 매우 빠르고 유연한 기능을 제공합니다.


3. ObjectMapper 클래스와 주요 설정

ObjectMapper는 Jackson 라이브러리의 핵심 클래스로, JSON과 자바 객체 간의 변환을 담당합니다.
configure 메서드를 사용하여 ObjectMapper의 동작을 커스터마이즈할 수 있습니다. 예를 들어, ACCEPT_SINGLE_VALUE_AS_ARRAY, FAIL_ON_UNKNOWN_PROPERTIES, FAIL_ON_NULL_FOR_PRIMITIVES 등의 설정을 사용하여 원하는 동작을 구성할 수 있습니다.


4. mapper.convertValue 메서드 활용

mapper.convertValue 메서드를 사용하면 JSON 데이터를 원하는 자바 객체로 변환할 수 있습니다. 이때, 변환 전 값(JSON)과 변환 후 클래스를 인자로 전달합니다. JSON에 없는 필드를 무시하거나, null인 경우 원시 데이터 형의 필드를 무시하는 등의 작업을 설정할 수 있습니다.

 

mapper.convertValue(변환 전 값(JSON), 변환 후 클래스) //단순 Object가 아닌 원하는 형태데이터(map, file, list 등)로 변환

import com.fasterxml.jackson.databind.ObjectMapper;

//Jackson: java.util.LinkedHashMap cannot be cast to X
ObjectMapper mapper = new ObjectMapper();
//MismatchedInputException: Cannot deserialize instance of 'java.util.ArrayList' out of START_OBJECT token
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //false: JSON에는 있지만 Mapping될 Object에는 없는 필드를 무시
mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);//true: null전달시 exception
List<DTONAME> str = mapper.convertValue(param.get("dtoList"), new TypeReference<DTONAME>() {});
//JNI: Unable to find constructor method id with signature '(Ljava/lang/String;)V'

 


5. 예외 처리

JSON과 자바 객체의 변환 과정에서 발생할 수 있는 예외에 대한 처리도 중요합니다. 블로그에서는 가능한 예외 상황과 그에 대한 적절한 처리 방법에 대해서도 설명합니다.

 

configure

https://fasterxml.github.io/jackson-core/javadoc/1.9/org/codehaus/jackson/map/DeserializationConfig.Feature.html

 

DeserializationConfig.Feature (Jackson JSON Processor)

Feature that determines whether Json integral (non-floating-point) numbers are to be deserialized into BigIntegers if only generic type description (either Object or Number, or within untyped Map or Collection context) is available. If enabled such values

fasterxml.github.io

 

//MismatchedInputException: Cannot deserialize instance of 'java.util.ArrayList' out of START_OBJECT token
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);