Java Jackson JSON Library
@JsonView
@JsonCreator
public class Customer {
private String id;
private String name;
private String address;
public Customer() {
}
@JsonCreator
public Customer(
@JsonProperty("id") String id,
@JsonProperty("fullname") String name,
@JsonProperty("location") String address) {
System.out.println("run constructor...");
this.id = id;
this.name = name;
this.address = address;
}
@Override
public String toString() {
return "Customer [id=" + id + ", name=" + name + ", address=" + address + "]";
}
}
Config 설정
ObjectMapper objectMapper = new ObjectMapper();
objectMapper
// 모르는 property에 대해 무시하고 넘어간다. DTO의 하위 호환성 보장에 필요하다.
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// ENUM 값이 존재하지 않으면 null로 설정한다. Enum 항목이 추가되어도 무시하고 넘어가게 할 때 필요하다.
.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
// 시간을 timestamp 숫자가 아닌, 문자열로 포맷팅한다. 기본 ISO 포맷
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
Bidirectional Relation 양방향 관계
Pretty Print
// 전역설정
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
// Writer 당 설정
new ObjectMapper()
.writer()
.withDefaultPrettyPrinter()
.writeValueAsString(객체);
Hibernate
-
Lazy Loading 필드일 경우 그냥 null 처리하고 넘어간다. 그러나 이미 로딩이 돼 있으면 직렬화 한다.
Lazy Loading 대상 필드의 값을 가져오는 getter가 존재한다면 @JsonIgnore
를 하거나 미리 로딩하지 않으면 다시 Lazy Loading Exception 이 발생한다.
-
양방향 관계에 대해
Jackson - Bidirectional Relationships JPA Entity 직렬화 방법들 참조
public class User {
public int id;
public String name;
// @JsonBackReference 애노테이션이 붙으면 직렬화를 하지 않는다.
@JsonBackReference
public List<Item> userItems;
}
public class Item {
public int id;
public String itemName;
@JsonManagedReference
public User owner;
}
{
"id":2,
"itemName":"book",
"owner":
{
"id":1,
"name":"John"
}
}
@JsonIdentityInfo
사용시에는 양방향 관계에서 Entity Id 만 직렬화해준다.
@JsonRawValue
@JsonInclude
JsonNodeFactory
JsonNodeFactory.instance.objectNode().put("id", 123L)
.put("name", "JSONNODE")
.put("age", 12)
.toString();
Java 8
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
// Up to Jackson 2.9: (but not with 3.0)
ObjectMapper mapper = new ObjectMapper()
.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule()); // new module, NOT JSR310Module
Jackson 2.10 부터 ObjectMapper 생성 방식 변경됨
JsonMapper objectMapper = JsonMapper.builder()
.addModules(new ParameterNamesModule(), new Jdk8Module(), new JavaTimeModule())
// 모르는 property 를 역직렬화 할 때 오류없이 무시하게 한다.
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
// 모르는 ENUM 값을 역직렬화 할 때 null로 취급하게 한다.
.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true)
// 시간 관련 객체(LocalDateTime, java.util.Date)를 직렬화 할 때 timestamp 숫자값이 아닌 포맷팅 문자열로 한다.
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
// 숫자를 문자로 직렬화하기, BigDecimal 보호?
.enable(JsonWriteFeature.WRITE_NUMBERS_AS_STRINGS)
.defaultTimeZone(TimeZone.getDefault())
.defaultLocale(Locale.getDefault())
.build();
Java 16 Record
-
Jackson >= 2.12.0 부터
Java 16 레코드 사용가능.
참고
Jackson Date @JsonFormat
(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss")
private Date createdAt;
-
-
-
-
-
-
-
-
-
-
-
-
-