Hello

[Jackson] JsonSerializer, JsonDeserializer 커스텀하게 사용하는 방법 본문

java

[Jackson] JsonSerializer, JsonDeserializer 커스텀하게 사용하는 방법

nari0_0 2023. 11. 8. 17:44
728x90

 

ajax 통신 할 때 json 구조를 사용하는 경우가 자주 있다 이때, string to enum, string to date, number to boolean 등 데이터 타입 변환이 필요한 경우가 있습니다.

이 때 상황에 따라 개발자는 custon serializer, deserializer를 작성해서 사용할 수 있습니다.

 

pom.xml

 <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
</dependency>

 

 

아래 abstract class를 구현해 사용할 수 있습니다.

  • com.fasterxml.jackson.databind.JsonSerializer 
  • com.fasterxml.jackson.databind.JsonDeserializer

number to boolean 예시

Serializer

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;

public class NumericBooleanSerializer extends JsonSerializer<Boolean> {

    @Override
    public void serialize(Boolean value, JsonGenerator gen, SerializerProvider serializers)
            throws IOException {
        gen.writeNumber(value ? 1 : 0);
    }
}

Deserializer

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;

public class NumericBooleanDeserializer extends JsonDeserializer<Boolean> {

    @Override
    public Boolean deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException {
        if (p.getNumberValue().intValue() == 1) {
            return Boolean.TRUE;
        } else if (p.getNumberValue().intValue() == 0) {
            return Boolean.FALSE;
        }
        return null;
    }
}

Java object (Jackson JSON)

 

- 어노테이션을 활용해 serialize, deserialize 적용 하는 방법.

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Data;

@Data
public class TestForm {
    private Integer id;
    private String name;
    @JsonDeserialize(using = NumericBooleanDeserializer.class)
    @JsonSerialize(using = NumericBooleanSerializer.class)
    private Boolean enable;
}

Test

    @Test
    void name() throws JsonProcessingException {
        TestForm testForm = new TestForm();
        testForm.setId(1);
        testForm.setName("test");
        testForm.setEnable(false);

        ObjectMapper om = new ObjectMapper();
        String strForm = om.writeValueAsString(testForm);
        System.out.println("json string: " + strForm);

        TestForm strToTestForm = om.readValue(strForm, TestForm.class);
        System.out.println("java object: " + strToTestForm);
        assertEquals("test", testForm.getName());

    }

 

+ @JsonComponent (spring boot)

- 구현한 Serializer을 ObjectMapper에 자동으로 등록해주는 역할을 한다.

- Java Object 필드에 @JsonDeserialize, @JsonSerialize를 작성하지 않아도 된다.

- 하나의 클래스에 JsonSerializer, JsonDeserializer를 작성해서 사용.

- JsonSerializer, JsonDeserializer을 구현한 구현체에 @JsonComponent를 작성해서 사용.

예시

 @JsonComponent
 public class CustomerJsonComponent {
     public static class Serializer extends JsonSerializer<Customer> {
         // ...
     }

     public static class Deserializer extends JsonDeserializer<Customer> {
         // ...
     }
 }
 
 ------------------------------------------------------------------------------
@JsonComponent
public class NumericBooleanDeserializer extends JsonDeserializer<Boolean> {

    @Override
    public Boolean deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException {
         // ...
    }
}

 

참고 :

 

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/jackson/JsonComponent.html

728x90