사용자 도구

사이트 도구


java:jackson

차이

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

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
java:jackson [2018/08/09 12:16]
kwon37xi
java:jackson [2019/02/28 15:46] (현재)
kwon37xi [@JsonCreator]
줄 23: 줄 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]]
줄 55: 줄 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>
줄 70: 줄 97:
   * Jackson 2 ''​ObjectMapper.setDateFormat()''​ 으로 ''​SimpleDateFormat''​을 지정할 수 있는데 이 경우 ''​SimpleDateFormat''​은 Thread Safe 하지 못해서 Jackson 이 매번 clone을 해서 재생성해서 날짜를 포맷팅한다.   * Jackson 2 ''​ObjectMapper.setDateFormat()''​ 으로 ''​SimpleDateFormat''​을 지정할 수 있는데 이 경우 ''​SimpleDateFormat''​은 Thread Safe 하지 못해서 Jackson 이 매번 clone을 해서 재생성해서 날짜를 포맷팅한다.
   * 성능 저하 요소가 될 수 있으므로 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]]
 +
  
 ===== 참고 ===== ===== 참고 =====
줄 82: 줄 151:
   * [[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]]
java/jackson.1533784587.txt.gz · 마지막으로 수정됨: 2018/08/09 12:16 저자 kwon37xi