Java/Short 개발

[Java/Short] 직렬화/역 직렬화 방법 : jackson-binding

adjh54 2024. 1. 4. 11:25
반응형
해당 글에서는 Java에서 객체를 직렬화하여 JSON 문자열로 바꾸거나 JSON 문자열을 역직렬화하여 객체로 변환하는 방법에 대해 알아봅니다.


 

1) 라이브러리 설치


💡 라이브러리 설치

- Jackson 라이브러리의 databind 모듈을 기반으로 직렬화, 역직렬화를 수행합니다.
dependencies {
	implementation 'com.fasterxml.jackson.core:jackson-databind:2.16.1'
}

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

2) 직렬화 방법 : Object to JSON String


 

1. 객체


package com.multiflex.multiflexchatgpt.dto;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PersonDto {

    private String id;
    private String pw;
    private String addr;

    @Builder
    public PersonDto(String id, String pw, String addr) {
        this.id = id;
        this.pw = pw;
        this.addr = addr;
    }
}

 
 
 

2. 직렬화 수행


💡 직렬화 수행

1. 객체의 데이터를 Builder로 구성하였습니다.

2. ObjectMapper 인스턴스화를 합니다.

3. writeValueAsString() 메서드로 직렬화를 수행합니다.

4. 직렬화된 데이터를 출력합니다.
@GetMapping("/3")
public ResponseEntity<Object> serializationApi() {
    String result = "";
    // [STEP1] 객체의 데이터를 builder로 구성하였습니다.
    PersonDto personDto = PersonDto.builder()
            .id("exampleId")
            .pw("examplePw")
            .addr("exampleAddr")
            .build();

    // [STEP2] ObjectMapper 인스턴스화
    ObjectMapper objectMapper = new ObjectMapper();
    try {
        // [STEP3] 직렬화를 수행합니다.
        result = objectMapper.writeValueAsString(personDto);

        // [STEP4] 직렬화된 데이터를 출력합니다.
        // 직렬화 :: {"id": "exampleId", "pw" : "examplePw", "addr" :"exampleAddr"}
        log.debug("직렬화 :: " + result);
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }
    return new ResponseEntity<>(result, HttpStatus.OK);
}

 
 
 

3. 결과 확인


 
 

3) 역 직렬화 방법 : JSON String to Object


 

1. 객체


 💡 객체

- 문자열로 직렬화 된 데이터를 객체 형태로 역 직렬화를 수행합니다.
package com.multiflex.multiflexchatgpt.dto;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class PersonDto {

    private String id;
    private String pw;
    private String addr;

    @Builder
    public PersonDto(String id, String pw, String addr) {
        this.id = id;
        this.pw = pw;
        this.addr = addr;
    }
}

 
 
 

2. 역 직렬화 수행


💡 역 직렬화 수행

1. ObjectMapper 인스턴스화를 합니다.

2. 역 직렬화를 수행합니다. : PersonDto 객체와 바인딩하여 동일한 형태로 역직렬화를 수행합니다.

3. 역 직렬화 된 데이터를 출력합니다.
@GetMapping("/4")
public ResponseEntity<Object> serializationApi() {
    String result = "";

    PersonDto personDto;
    try {
        // [STEP1] ObjectMapper 인스턴스화를 합니다.
        ObjectMapper objectMapper = new ObjectMapper();

        // [STEP2] 역 직렬화를 수행합니다. : PersonDto 객체와 바인딩하여 동일한 형태로 역직렬화를 수행합니다.
        personDto = objectMapper.readValue(result, PersonDto.class);
        
        // [STEP3] 역 직렬화를 출력합니다.
        log.debug("역 직렬화 ::" + personDto);
    } catch (JsonProcessingException e) {
        throw new RuntimeException(e);
    }

    return new ResponseEntity<>(personDto, HttpStatus.OK);
}

 
 
 

3. 결과확인


4) Jackson-databind 클래스 및 메서드


 
 

클래스메서드설명
ObjectMapperwriteValueAsString(value: Any)지정된 객체를 JSON 문자열로 직렬화합니다.
ObjectMapperreadValue(content: String, valueType: TypeReference<T>)주어진 JSON 문자열을 지정된 타입의 객체로 변환합니다.
ObjectMapperconfigure()ObjectMapper의 구성을 설정합니다.
ObjectMapperregisterModule(module: Module)지정된 모듈을 ObjectMapper에 등록합니다.
ObjectMapperdisable(feature: JsonParser.Feature)지정된 JSON 파서 기능을 비활성화합니다.
ObjectMapperenable(feature: JsonParser.Feature)지정된 JSON 파서 기능을 활성화합니다.
ObjectMapperfindAndRegisterModules()클래스 경로에서 사용 가능한 모듈을 찾아 ObjectMapper에 등록합니다.
ObjectMapperwriterWithDefaultPrettyPrinter()기본 PrettyPrinter를 사용하는 ObjectWriter를 반환합니다.
ObjectMappersetVisibilityChecker(checker: VisibilityChecker<*>)지정된 가시성 검사기를 ObjectMapper에 설정합니다.
ObjectMappersetDefaultPropertyInclusion(inclusion: JsonInclude.Include)기본 속성 포함 규칙을 설정합니다.
ObjectMappersetSerializationInclusion(inclusion: JsonInclude.Include)직렬화 중에 속성을 포함할지 여부를 설정합니다.
ObjectMappersetDeserializationInclusion(inclusion: JsonInclude.Include)역직렬화 중에 속성을 포함할지 여부를 설정합니다.
ObjectMapperconfigure(feature: SerializationFeature, state: Boolean)지정된 직렬화 기능을 설정하거나 해제합니다.
ObjectMapperconfigure(feature: DeserializationFeature, state: Boolean)지정된 역직렬화 기능을 설정하거나 해제합니다.
ObjectMapperconfigure(feature: MapperFeature, state: Boolean)지정된 매퍼 기능을 설정하거나 해제합니다.
ObjectMapperconfigure(feature: JsonParser.Feature, state: Boolean)지정된 JSON 파서 기능을 설정하거나 해제합니다.
ObjectMapperconfigure(feature: JsonGenerator.Feature, state: Boolean)지정된 JSON 생성기 기능을 설정하거나 해제합니다.
ObjectMapperenableDefaultTyping()기본 타입 정보 포함을 활성화합니다.
ObjectMapperdisableDefaultTyping()기본 타입 정보 포함을 비활성화합니다.

 

jackson-databind 2.16.1 javadoc (com.fasterxml.jackson.core)

Latest version of com.fasterxml.jackson.core:jackson-databind https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-databind Current version 2.16.1 https://javadoc.io/doc/com.fasterxml.jackson.core/jackson-databind/2.16.1 package-list path (used for ja

www.javadoc.io

 
 
 
 
오늘도 감사합니다. 😀
 
 
 

반응형