사용자 도구

사이트 도구


java:jackson

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:jackson [2019/02/28 15:46]
kwon37xi [@JsonCreator]
java:jackson [2023/10/04 14:47] (현재)
kwon37xi
줄 1: 줄 1:
 ====== Java Jackson JSON Library ====== ====== Java Jackson JSON Library ======
   * [[java:jackson:jsonfilter|Jackson JsonFilter]]   * [[java:jackson:jsonfilter|Jackson JsonFilter]]
 +  * [[java:jackson:squiggly|Squiggly]]
   * [[http://www.baeldung.com/jackson|Jackson Tutorial]]   * [[http://www.baeldung.com/jackson|Jackson Tutorial]]
   * [[http://www.baeldung.com/jackson-ignore-properties-on-serialization|Jackson Ignore Properties on Marshalling]]   * [[http://www.baeldung.com/jackson-ignore-properties-on-serialization|Jackson Ignore Properties on Marshalling]]
줄 19: 줄 20:
   * Spring 4.1 부터 ''@JsonView'', [[https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/json/MappingJacksonValue.html|Spring MappingJacksonViewValue]] 지원   * Spring 4.1 부터 ''@JsonView'', [[https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/converter/json/MappingJacksonValue.html|Spring MappingJacksonViewValue]] 지원
   * [[https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring|Latest Jackson integration improvements in Spring]]   * [[https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring|Latest Jackson integration improvements in Spring]]
 +  * [[https://www.baeldung.com/jackson-json-view-annotation|Jackson JSON Views | Baeldung]]
 ===== @JsonCreator ===== ===== @JsonCreator =====
   * 해당 클래스 JSON 문자열을 받아서 객체를 생성할 때 변환기를 직접 만들고자 할 때 구현한다.   * 해당 클래스 JSON 문자열을 받아서 객체를 생성할 때 변환기를 직접 만들고자 할 때 구현한다.
줄 57: 줄 58:
 ObjectMapper objectMapper = new ObjectMapper(); ObjectMapper objectMapper = new ObjectMapper();
  
-// 모르는 property에 대해 무시하고 넘어간다. DTO의 하위 호환성 보장에 필요하다. +objectMapper 
-objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);+  // 모르는 property에 대해 무시하고 넘어간다. DTO의 하위 호환성 보장에 필요하다. 
 +  .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  
-// ENUM 값이 존재하지 않으면 null로 설정한다. Enum 항목이 추가되어도 무시하고 넘어가게 할 때 필요하다. +  // ENUM 값이 존재하지 않으면 null로 설정한다. Enum 항목이 추가되어도 무시하고 넘어가게 할 때 필요하다. 
-objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);+  .configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true); 
 +  // 시간을 timestamp 숫자가 아닌, 문자열로 포맷팅한다. 기본 ISO 포맷 
 +  .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
 </code> </code>
  
-===== Java 8 설정 ===== 
-  * https://github.com/FasterXML/jackson-modules-java8 
- 
-<code java> 
-ObjectMapper mapper = new ObjectMapper() 
-   .registerModule(new ParameterNamesModule()) 
-   .registerModule(new Jdk8Module()) 
-   .registerModule(new JavaTimeModule()); 
-</code> 
- 
-  * [[https://github.com/joschi/jackson-datatype-threetenbp|Java 7용 310 date time backport Jackson Module]] 
  
 ===== Bidirectional Relation 양방향 관계 ===== ===== Bidirectional Relation 양방향 관계 =====
줄 95: 줄 88:
  
 ===== setDateFormat 주의 ===== ===== setDateFormat 주의 =====
-  Jackson 2 ''ObjectMapper.setDateFormat()'' 으로 ''SimpleDateFormat''을 할 수 있는데 이 경우 ''SimpleDateFormat''은 Thread Safe 지 못해서 Jackson 이 매번 clone을 해서 재생성해서 날짜를 포맷팅한다. +    * **''simpleDateFormat(), dateFormat()''을 하면 ''ObjectMapper''가 non-thread-safe 게 돼 버린다.*지말고, ''java.util.Date''도 사용하지 말 것.
-  성능 저하 요소가 될 수 있으므로 Java 8 이상에서는 가급적이면 ''LocalDateTime'' 등을 사용하는게 좋겠다.+
  
 ===== Hibernate ===== ===== Hibernate =====
줄 140: 줄 132:
  
  
 +===== @JsonInclude =====
 +  * [[https://www.baeldung.com/jackson-ignore-null-fields|Ignore Null Fields with Jackson | Baeldung]]
 +  * ''@JsonInclude(INclude.NON_NULL)'' : null인경우 아예 렌더링을 하지 않는다.
 +  * [[https://alwayspr.tistory.com/31|[Jackson] JsonInclude 속성에 대해 알아보자.]]
 +===== JsonNodeFactory =====
 +  * [[https://fasterxml.github.io/jackson-databind/javadoc/2.1.0/com/fasterxml/jackson/databind/node/JsonNodeFactory.html|JsonNodeFactory]]
 +  * ''JsonNodeFactory.instance.objectNode()'' 를 통해 원하는 형태의 JSON 을 생성할 수 있다.
 +  * [[java:json|Java JSON]]
 +
 +<code java>
 +JsonNodeFactory.instance.objectNode().put("id", 123L)
 +            .put("name", "JSONNODE")
 +            .put("age", 12)
 +            .toString();
 +</code>
 +
 +===== Java 8 =====
 +  * [[https://github.com/FasterXML/jackson-modules-java8|jackson modules java8]]
 +  * Jackson 2 까지는 다음과 같이 모듈들을 추가해줘야 하며 Jackson 3 부터는 Java 8이 필수라서 기본 지원이 된다.
 +
 +<code>
 +<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>
 +</code>
 +
 +<code java>
 +// 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
 +
 +</code>
 +  * ''SerializationFeature.WRITE_DATES_AS_TIMESTAMPS: false'' 설정이 있어야만 ''LocalDateTime'' 등을 ''ISO_LOCAL_DATE_TIME'' format 등으로 직렬화한다.
 +
 +===== Jackson 2.10 부터 ObjectMapper 생성 방식 변경됨 =====
 +<code java>
 +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();
 +</code>
 +
 +===== Java 16 Record =====
 +  * [[https://carloschac.in/2021/03/04/jacksonrecords/|💾 Java Records 💿 with Jackson 2.12 | Carlos Chacin]]
 +  * Jackson >= 2.12.0 부터 [[java:16|Java 16]] 레코드 사용가능.
 ===== 참고 ===== ===== 참고 =====
   * [[http://www.baeldung.com/jackson-serialize-dates|Jackson Date]]<code java>   * [[http://www.baeldung.com/jackson-serialize-dates|Jackson Date]]<code java>
줄 155: 줄 212:
   * [[https://www.baeldung.com/jackson-annotations|Jackson Annotation Examples | Baeldung]]   * [[https://www.baeldung.com/jackson-annotations|Jackson Annotation Examples | Baeldung]]
   * [[https://cheese10yun.github.io/jackson-annotation/|Jackson 어노테이션 사용법(1) - Yun Blog]]   * [[https://cheese10yun.github.io/jackson-annotation/|Jackson 어노테이션 사용법(1) - Yun Blog]]
 +  * [[https://dzone.com/articles/jackson-json-and-the-proper-handling-of-unknown-fi|Jackson, JSON and the Proper Handling of Unknown Fields in APIs - DZone Java]]
 +  * [[https://www.baeldung.com/jackson-ignore-null-fields|Ignore Null Fields with Jackson | Baeldung]]
 +  * [[https://www.baeldung.com/jackson-field-serializable-deserializable-or-not|Jackson - Decide What Fields Get (De)Serialized | Baeldung]]
 +  * [[https://www.baeldung.com/jackson-deserialization|Getting Started with Deserialization in Jackson | Baeldung]]
java/jackson.1551336382.txt.gz · 마지막으로 수정됨: 2019/02/28 15:46 저자 kwon37xi