사용자 도구

사이트 도구


java:jackson

차이

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

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
다음 판 양쪽 다음 판
java:jackson [2018/08/09 11:25]
kwon37xi [JSON Filter]
java:jackson [2020/07/22 14:31]
kwon37xi [Java 8]
줄 1: 줄 1:
 ====== Java Jackson JSON Library ====== ====== Java Jackson JSON Library ======
 +  * [[java:jackson:jsonfilter|Jackson JsonFilter]]
   * [[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]]
줄 10: 줄 11:
   * [[http://www.baeldung.com/java-json|JSON in Java]]   * [[http://www.baeldung.com/java-json|JSON in Java]]
  
-===== JSON Filter ===== 
-  * ''@JsonFilter'' : Filter ID를 문자열로 지정한다. 일단 이 애노테이션을 사용하면 무조건 ''FilterProvider''와 해당 ID를 처리하는 필터를 제공해야 한다. 
-  * ''SimpleFilterProvider'' 
-    * ''setDefaultFilter'' : Filter ID에 해당하는 필터가 존재하지 않을 경우 기본처리할 필터. 지정하지 않으면 오류 발생. 
-  * ''SimpleBeanPropertyFilter.filterOutAllExcept'' : 지정된 필드들만 JSON 변환한다. 알 수 없는 필드는 무시한다. 이 방식을 권장한다. 명백히 검증된 필드만 내보낸다. 
-  * ''SimpleBeanPropertyFilter.serializeAllExcept'' : 지정된 필드를 제외한 나머지 모두를 JSON 변환한다. 알 수 없는 필드는 무시한다. 이 방식은 **추후에 추가되는 필드가 오류를 유발시키거나 보안상 위협이 될 수도 있기 때문에 권하고 싶지 않다**. 
-  * ''objectMapper.writer(filterProvider)'' 
-  * [[https://www.baeldung.com/jackson-serialize-field-custom-criteria|Serialize Only Fields that meet a Custom Criteria with Jackson]] 
-  * [[http://javagalleog.blogspot.kr/2016/04/json-filters-for-spring-mvc.html|Java Tips for Geeks: JSON filters for Spring MVC]] 
-  * [[https://www.concretepage.com/jackson-api/jackson-jsonfilter-example|Jackson @JsonFilter Example]] 
-  * [[http://jsonobject.tistory.com/258|Jackson, 커스텀 @JsonFilter로 조건에 맞는 필드만 JSON 변환하기]] 
-  * [[https://sdqali.in/blog/2016/06/08/filtering-responses-in-spring-mvc/|Filtering responses in Spring MVC - {code that works} by Sadique Ali]] 
-  * Spring 4.2 부터 ''@JsonFilter''도 지원함 
-  * [[http://blog.bafoly.com/2016/06/returning-role-based-content-in-spring-rest-controller/|Returning role based content in Spring Rest Controller – bbk notes]] 
-  * [[https://github.com/Baeldung/spring-hypermedia-api/blob/master/src/main/java/com/baeldung/web/controller/NewBookController.java|spring-hypermedia-api/NewBookController.java at master · Baeldung/spring-hypermedia-api]] 
-  * [[https://stackoverflow.com/questions/11036366/filter-nested-objects-using-jacksons-beanpropertyfilter|Filter nested objects using Jackson's BeanPropertyFilter - Stack Overflow]] 
  
-<code java> 
-  @RequestMapping(method=RequestMethod.GET) 
-  public MappingJacksonValue getMovies(@AuthenticatedUser TutorialUser user){ 
-    List<Movie> movieList = movieDao.findAll(); 
-    MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(movieList); 
- 
-    mappingJacksonValue.setFilters(new SimpleFilterProvider().addFilter("movie",  
-      SimpleBeanPropertyFilter.filterOutAllExcept(user!=null && user.isAdmin() ? all : limited))); 
-   
-    return mappingJacksonValue; 
-  } 
-</code> 
 ===== @JsonView ===== ===== @JsonView =====
   * 객체의 필드를 선별적으로 직렬화 할 수 있다.   * 객체의 필드를 선별적으로 직렬화 할 수 있다.
줄 50: 줄 23:
   * 해당 클래스 JSON 문자열을 받아서 객체를 생성할 때 변환기를 직접 만들고자 할 때 구현한다.   * 해당 클래스 JSON 문자열을 받아서 객체를 생성할 때 변환기를 직접 만들고자 할 때 구현한다.
   * [[https://fasterxml.github.io/jackson-annotations/javadoc/2.7/com/fasterxml/jackson/annotation/JsonCreator.html|@JsonCreator]]   * [[https://fasterxml.github.io/jackson-annotations/javadoc/2.7/com/fasterxml/jackson/annotation/JsonCreator.html|@JsonCreator]]
 +  * [[https://grokonez.com/java/jackson-jsoncreator-example-deserialize-jsoncreator|Jackson @JsonCreator example - Deserialize with @JsonCreator - grokonez]] 
 +<code java> 
 +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 + "]"; 
 +    } 
 +
 +</code>
 ===== Performance ===== ===== Performance =====
   * [[http://wiki.fasterxml.com/JacksonBestPracticesPerformance|Jackson Best Practice Performance]]   * [[http://wiki.fasterxml.com/JacksonBestPracticesPerformance|Jackson Best Practice Performance]]
줄 82: 줄 81:
   * [[https://fasterxml.github.io/jackson-annotations/javadoc/2.6/com/fasterxml/jackson/annotation/JsonIdentityInfo.html|@JsonIdentityInfo]] 동일 ID에 대해 중복 출력 방지   * [[https://fasterxml.github.io/jackson-annotations/javadoc/2.6/com/fasterxml/jackson/annotation/JsonIdentityInfo.html|@JsonIdentityInfo]] 동일 ID에 대해 중복 출력 방지
   * [[https://github.com/FasterXML/jackson-datatype-hibernate|Jackson Datatype Hibernate]] Hibernate Lazy loading 필드를 Jackson 직렬화 대상에서 제외   * [[https://github.com/FasterXML/jackson-datatype-hibernate|Jackson Datatype Hibernate]] Hibernate Lazy loading 필드를 Jackson 직렬화 대상에서 제외
 +
 ===== Pretty Print ===== ===== Pretty Print =====
 <code java> <code java>
줄 98: 줄 98:
   * 성능 저하 요소가 될 수 있으므로 Java 8 이상에서는 가급적이면 ''LocalDateTime'' 등을 사용하는게 좋겠다.   * 성능 저하 요소가 될 수 있으므로 Java 8 이상에서는 가급적이면 ''LocalDateTime'' 등을 사용하는게 좋겠다.
  
 +===== Hibernate =====
 +  * [[java:hibernate|Hibernate]] 사용시 LazyLoading 문제 해소 모듈
 +  * Lazy Loading 필드일 경우 그냥 null 처리하고 넘어간다. 그러나 이미 로딩이 돼 있으면 직렬화 한다.
 +  * Lazy Loading 대상 필드의 값을 가져오는 getter가 존재한다면 ''@JsonIgnore''를 하거나 미리 로딩하지 않으면 다시 Lazy Loading Exception 이 발생한다.
 +  * [[https://github.com/FasterXML/jackson-datatype-hibernate|jackson-datatype-hibernate]]
 +  * 양방향 관계에 대해 [[https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion|Jackson - Bidirectional Relationships JPA Entity 직렬화 방법들]] 참조<code java>
 +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;
 +}
 +</code><code json>
 +{
 + "id":2,
 + "itemName":"book",
 + "owner":
 +    {
 +        "id":1,
 +        "name":"John"
 +    }
 +}
 +</code>
 +  * ''@JsonIdentityInfo'' 사용시에는 양방향 관계에서 Entity Id 만 직렬화해준다.
 +
 +===== @JsonRawValue =====
 +  * [[https://www.logicbig.com/tutorials/misc/jackson/json-raw-value.html|Jackson JSON - Using @JsonRawValue to serialize property as it is]]
 +  * String 필드게 JSON 문자열이 저장돼 있을 경우 이를 JSON 으로 간주하고 리턴
 +  * 직렬화에서는 작동하지만 역직렬화에서는 작동하지 않는다.
 +  * [[https://stackoverflow.com/questions/4783421/how-can-i-include-raw-json-in-an-object-using-jackson|java - How can I include raw JSON in an object using Jackson? - Stack Overflow]]
 +
 +
 +===== 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
 +
 +// with 3.0 (or with 2.10 as alternative)
 +ObjectMapper mapper = JsonMapper.builder() // or different mapper for other format
 +   .addModule(new ParameterNamesModule())
 +   .addModule(new Jdk8Module())
 +   .addModule(new JavaTimeModule())
 +   // and possibly other configuration, modules, then:
 +   .build();
 +</code>
 ===== 참고 ===== ===== 참고 =====
   * [[http://www.baeldung.com/jackson-serialize-dates|Jackson Date]]<code java>   * [[http://www.baeldung.com/jackson-serialize-dates|Jackson Date]]<code java>
줄 109: 줄 197:
   * [[https://dzone.com/articles/jackson-annotations-for-json-part-2-serialization|Jackson Annotations for JSON (Part 2): Serialization - DZone Java]]   * [[https://dzone.com/articles/jackson-annotations-for-json-part-2-serialization|Jackson Annotations for JSON (Part 2): Serialization - DZone Java]]
   * [[https://www.javacodegeeks.com/2018/01/ignore-unknown-properties-parsing-json-java-jackson-jsonignoreproperties-annotation-example.html|How to ignore unknown properties while parsing JSON in Java - Jackson @JsonIgnoreProperties Annotation Example | Java Code Geeks - 2018]]   * [[https://www.javacodegeeks.com/2018/01/ignore-unknown-properties-parsing-json-java-jackson-jsonignoreproperties-annotation-example.html|How to ignore unknown properties while parsing JSON in Java - Jackson @JsonIgnoreProperties Annotation Example | Java Code Geeks - 2018]]
 +  * [[https://www.baeldung.com/jackson-serialize-enums|How To Serialize Enums as JSON Objects with Jackson | Baeldung]]
 +  * [[https://www.baeldung.com/jackson-mapping-dynamic-object|Mapping a Dynamic JSON Object with Jackson | Baeldung]]
 +  * [[https://www.baeldung.com/jackson-annotations|Jackson Annotation Examples | Baeldung]]
 +  * [[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]]
java/jackson.txt · 마지막으로 수정됨: 2023/10/04 14:47 저자 kwon37xi