Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- mysql equal null
- NamedEntityGraph
- sendFractionalSeconds
- apatch poi
- mysql =
- @EntityListeners
- AuditingEntityListener
- mysql not equal null
- createEntityGraph
- pooled-lo
- +9:00
- fractional seconds
- 티스토리챌린지
- getEntityGraph
- deserializer
- @CreateDate
- 1*1000
- getDateCellValue
- 버전 문자열 비교
- Protecle
- 오블완
- EmbeddedId
- load order
- 운동해서 광명찾자
- MYSQL
- spring boot
- https
- yml
- RootGraph
- MSSQL
Archives
- Today
- Total
Hello
[Jackson] JsonSerializer, JsonDeserializer 커스텀하게 사용하는 방법 본문
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
'java' 카테고리의 다른 글
점으로 구분된 버전 문자열 비교 (0) | 2023.12.06 |
---|---|
[JPA] JPA Auditing이란 (+Spring Data JPA Auditing) (0) | 2023.11.17 |
Java MultipartFile to String (0) | 2023.10.25 |
[JPA] 일대일 조인 테이블 @EmbeddedId 사용 (0) | 2023.10.12 |
JPA 기본키 생성 전략 (0) | 2023.09.07 |