문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
java:jackson [2019/01/11 17:47] kwon37xi |
java:jackson [2023/10/04 14:47] kwon37xi |
||
---|---|---|---|
줄 1: | 줄 1: | ||
====== Java Jackson JSON Library ====== | ====== Java Jackson JSON Library ====== | ||
* [[java: | * [[java: | ||
+ | * [[java: | ||
* [[http:// | * [[http:// | ||
* [[http:// | * [[http:// | ||
줄 19: | 줄 20: | ||
* Spring 4.1 부터 '' | * Spring 4.1 부터 '' | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
===== @JsonCreator ===== | ===== @JsonCreator ===== | ||
* 해당 클래스 JSON 문자열을 받아서 객체를 생성할 때 변환기를 직접 만들고자 할 때 구현한다. | * 해당 클래스 JSON 문자열을 받아서 객체를 생성할 때 변환기를 직접 만들고자 할 때 구현한다. | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
+ | <code java> | ||
+ | public class Customer { | ||
+ | private String id; | ||
+ | private String name; | ||
+ | private String address; | ||
+ | |||
+ | public Customer() { | ||
+ | } | ||
+ | |||
+ | @JsonCreator | ||
+ | public Customer( | ||
+ | @JsonProperty(" | ||
+ | @JsonProperty(" | ||
+ | @JsonProperty(" | ||
+ | System.out.println(" | ||
+ | this.id = id; | ||
+ | this.name = name; | ||
+ | this.address = address; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public String toString() { | ||
+ | return " | ||
+ | } | ||
+ | } | ||
+ | </ | ||
===== Performance ===== | ===== Performance ===== | ||
* [[http:// | * [[http:// | ||
줄 31: | 줄 58: | ||
ObjectMapper objectMapper = new ObjectMapper(); | ObjectMapper objectMapper = new ObjectMapper(); | ||
- | // 모르는 property에 대해 무시하고 넘어간다. DTO의 하위 호환성 보장에 필요하다. | + | objectMapper |
- | objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, | + | |
+ | .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, | ||
- | // ENUM 값이 존재하지 않으면 null로 설정한다. Enum 항목이 추가되어도 무시하고 넘어가게 할 때 필요하다. | + | |
- | objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, | + | .configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, |
+ | // 시간을 timestamp 숫자가 아닌, 문자열로 포맷팅한다. 기본 ISO 포맷 | ||
+ | .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, | ||
</ | </ | ||
- | ===== Java 8 설정 ===== | ||
- | * https:// | ||
- | |||
- | <code java> | ||
- | ObjectMapper mapper = new ObjectMapper() | ||
- | | ||
- | | ||
- | | ||
- | </ | ||
- | |||
- | * [[https:// | ||
===== Bidirectional Relation 양방향 관계 ===== | ===== Bidirectional Relation 양방향 관계 ===== | ||
줄 69: | 줄 88: | ||
===== setDateFormat 주의 ===== | ===== setDateFormat 주의 ===== | ||
- | | + | * **'' |
- | | + | |
===== Hibernate ===== | ===== Hibernate ===== | ||
* [[java: | * [[java: | ||
+ | * Lazy Loading 필드일 경우 그냥 null 처리하고 넘어간다. 그러나 이미 로딩이 돼 있으면 직렬화 한다. | ||
+ | * Lazy Loading 대상 필드의 값을 가져오는 getter가 존재한다면 '' | ||
* [[https:// | * [[https:// | ||
+ | * 양방향 관계에 대해 [[https:// | ||
+ | public class User { | ||
+ | public int id; | ||
+ | public String name; | ||
+ | |||
+ | // @JsonBackReference 애노테이션이 붙으면 직렬화를 하지 않는다. | ||
+ | @JsonBackReference | ||
+ | public List< | ||
+ | } | ||
+ | |||
+ | public class Item { | ||
+ | public int id; | ||
+ | public String itemName; | ||
+ | |||
+ | @JsonManagedReference | ||
+ | public User owner; | ||
+ | } | ||
+ | </ | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | { | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | * '' | ||
+ | |||
+ | ===== @JsonRawValue ===== | ||
+ | * [[https:// | ||
+ | * String 필드게 JSON 문자열이 저장돼 있을 경우 이를 JSON 으로 간주하고 리턴 | ||
+ | * 직렬화에서는 작동하지만 역직렬화에서는 작동하지 않는다. | ||
+ | * [[https:// | ||
+ | |||
+ | |||
+ | ===== @JsonInclude ===== | ||
+ | * [[https:// | ||
+ | * '' | ||
+ | * [[https:// | ||
+ | ===== JsonNodeFactory ===== | ||
+ | * [[https:// | ||
+ | * '' | ||
+ | * [[java: | ||
+ | |||
+ | <code java> | ||
+ | JsonNodeFactory.instance.objectNode().put(" | ||
+ | .put(" | ||
+ | .put(" | ||
+ | .toString(); | ||
+ | </ | ||
+ | |||
+ | ===== Java 8 ===== | ||
+ | * [[https:// | ||
+ | * Jackson 2 까지는 다음과 같이 모듈들을 추가해줘야 하며 Jackson 3 부터는 Java 8이 필수라서 기본 지원이 된다. | ||
+ | |||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | <code java> | ||
+ | // Up to Jackson 2.9: (but not with 3.0) | ||
+ | ObjectMapper mapper = new ObjectMapper() | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | </ | ||
+ | * '' | ||
+ | |||
+ | ===== Jackson 2.10 부터 ObjectMapper 생성 방식 변경됨 ===== | ||
+ | <code java> | ||
+ | JsonMapper objectMapper = JsonMapper.builder() | ||
+ | .addModules(new ParameterNamesModule(), | ||
+ | // 모르는 property 를 역직렬화 할 때 오류없이 무시하게 한다. | ||
+ | .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, | ||
+ | // 모르는 ENUM 값을 역직렬화 할 때 null로 취급하게 한다. | ||
+ | .configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, | ||
+ | // 시간 관련 객체(LocalDateTime, | ||
+ | .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, | ||
+ | // 숫자를 문자로 직렬화하기, | ||
+ | .enable(JsonWriteFeature.WRITE_NUMBERS_AS_STRINGS) | ||
+ | .defaultTimeZone(TimeZone.getDefault()) | ||
+ | .defaultLocale(Locale.getDefault()) | ||
+ | .build(); | ||
+ | </ | ||
+ | ===== Java 16 Record ===== | ||
+ | * [[https:// | ||
+ | * Jackson >= 2.12.0 부터 [[java: | ||
===== 참고 ===== | ===== 참고 ===== | ||
* [[http:// | * [[http:// | ||
줄 89: | 줄 210: | ||
* [[https:// | * [[https:// | ||
* [[https:// | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// | ||
+ | * [[https:// |