Spring/Spring Boot

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

noahkim_ 2023. 10. 9. 02:33

1. Jackson

  • jackson은 Spring Boot에서 기본적으로 제공되는 JSON 직렬화 도구입니다.
    • spring-boot-starter-json 모듈의 도구입니다.
    • auto-configuration 기능으로 제공되는 도구입니다.
      • 직렬화를 담당하는 클래스인 ObjectMapper가 자동으로 설정됩니다.

 

Custom Serializers and Deserializers

  • ObjectMapper는 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);
        }
    }
}
  • @JsonComponent  
    • JsonSerializer와 JsonDeserializer 클래스 커스터마이징을 쉽게 하도록 Spring Boot에서 제공하는 어노테이션입니다.
    • @JsonComponent는 @Component를 가진 메타 어노테이션입니다.
    • JsonSerializer와 JsonDeserializer 클래스를 inner class로 두고 커스터마이징하면 됩니다.

 

@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를 확장한 helper base class입니다.
    • 직렬화 및 역직렬화를 단순화하도록 설계되었습니다.

 

Mixins

  • target class에 이미 선언된 애노테이션에 추가적인 애노테이션을 혼합할 수 있도록 지원하는 기능입니다.
  • 추가적인 직렬화 및 역직렬화 지시를 구성할 수 있습니다.
  • auto-configuration은 @JsonMixin이 달린 클래스를 찾아 ObjectMapper에 등록합니다.
    • JsonMixinModule에 의해 수행됩니다.

 

public class User {
    public int id;
    public String name;
}

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

 

 

참고