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 {
// ...
}
}
참고 :
728x90