Spring/Spring Boot

[Spring Boot] 2-6. Core Features: JSON

noahkim_ 2023. 10. 9. 02:33

1. Jackson

항목 설명
기본 제공
Spring Boot는 spring-boot-starter-json을 통해 Jackson을 기본 JSON 직렬화 도구로 사용
자동 설정
Spring Boot의 Auto-Configuration에 의해 ObjectMapper가 자동 설정됨
핵심 클래스
ObjectMapper: 직렬화/역직렬화의 중심 클래스

 

Custom Serializers and Deserializers

@JsonComponent
항목 설명
정의
커스텀 Serializer/Deserializer를 빈으로 자동 등록
ObjectMapper에 등록됨
특징
내부 클래스 형태로 JsonSerializer, JsonDeserializer 구현 가능
메타 정보
@Component가 메타 어노테이션으로 포함되어 있음

 

 

예시) 커스텀 JsonSerializer / JsonDeserializer

더보기
@JsonComponent
public class MyJsonComponent {
    public static class Serializer extends JsonSerializer<MyObject> {

        @Override
        public void serialize(MyObject value, JsonGenerator jgen, SerializerProvider serializers) throws IOException {
            jgen.writeStartObject();
            jgen.writeStringField("name", value.getName());
            jgen.writeNumberField("age", value.getAge());
            jgen.writeEndObject();
        }
    }

    public static class Deserializer extends JsonDeserializer<MyObject> {

        @Override
        public MyObject deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
            ObjectCodec codec = jsonParser.getCodec();
            JsonNode tree = codec.readTree(jsonParser);
            String name = tree.get("name").textValue();
            int age = tree.get("age").intValue();
            return new MyObject(name, age);
        }
    }
}
  • serialize, deserialize 메서드를 오버라이드하여 원하는 JSON 포맷으로 커스터마이징

 

예시) 커스텀 JsonObjectSerializer / JsonObjectDeserializer

더보기
@JsonComponent
public class MyJsonComponent {
    public static class Serializer extends JsonObjectSerializer<MyObject> {

        @Override
        protected void serializeObject(MyObject value, JsonGenerator jgen, SerializerProvider provider)
                throws IOException {
            jgen.writeStringField("name", value.getName());
            jgen.writeNumberField("age", value.getAge());
        }
    }

    public static class Deserializer extends JsonObjectDeserializer<MyObject> {

        @Override
        protected MyObject deserializeObject(JsonParser jsonParser, DeserializationContext context, ObjectCodec codec,
                JsonNode tree) throws IOException {
            String name = nullSafeValue(tree.get("name"), String.class);
            int age = nullSafeValue(tree.get("age"), Integer.class);
            return new MyObject(name, age);
        }
    }
}
항목 설명
JsonObjectSerializer
JsonObjectDeserializer
JsonSerializer, JsonDeserializer의 헬퍼 베이스 클래스
장점
코드 간소화, serializeObject, deserializeObject만 오버라이드하면 됨
null-safe
예: nullSafeValue(tree.get("name"), String.class) 같은 헬퍼 메서드 사용 가능

 

Mixins

항목 설명
목적
기존 클래스에 직접 애노테이션을 수정하지 않고 직렬화/역직렬화 설정을 추가할 수 있음
대상
주로 라이브러리 클래스나 외부 클래스 등 수정 불가한 클래스
구성 방식
@JsonMixin(TargetClass.class)를 사용하여 별도의 Mixin 클래스에서 필드 매핑

 

예제) UserMixin

더보기
@JsonMixin(UserMixin.class)
public class User {
    public int id;
    public String name;
}
public class UserMixin {
    @JsonProperty("user_id")
    public int id;
 
    @JsonProperty("user_name")
    public String name;
}
  • User 클래스의 id, name 필드를 UserMixin에서 사용된 @JsonProperty의 값으로 매핑됩니다.

 

 

참고