문서의 이전 판입니다!
@Annotation
지옥이 필쳐질 수도 있다.@JsonView
, Spring MappingJacksonViewValue 지원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 + "]"; } }
ObjectMapper objectMapper = new ObjectMapper(); // 모르는 property에 대해 무시하고 넘어간다. DTO의 하위 호환성 보장에 필요하다. objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // ENUM 값이 존재하지 않으면 null로 설정한다. Enum 항목이 추가되어도 무시하고 넘어가게 할 때 필요하다. objectMapper.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL, true);
ObjectMapper mapper = new ObjectMapper() .registerModule(new ParameterNamesModule()) .registerModule(new Jdk8Module()) .registerModule(new JavaTimeModule());
// 전역설정 objectMapper.enable(SerializationFeature.INDENT_OUTPUT); // Writer 당 설정 new ObjectMapper() .writer() .withDefaultPrettyPrinter() .writeValueAsString(객체);
ObjectMapper.setDateFormat()
으로 SimpleDateFormat
을 지정할 수 있는데 이 경우 SimpleDateFormat
은 Thread Safe 하지 못해서 Jackson 이 매번 clone을 해서 재생성해서 날짜를 포맷팅한다.LocalDateTime
등을 사용하는게 좋겠다.@JsonIgnore
를 하거나 미리 로딩하지 않으면 다시 Lazy Loading Exception 이 발생한다.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 만 직렬화해준다.JsonNodeFactory.instance.objectNode()
를 통해 원하는 형태의 JSON 을 생성할 수 있다.JsonNodeFactory.instance.objectNode().put("id", 123L) .put("name", "JSONNODE") .put("age", 12) .toString();
<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>
@JsonFormat (shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss") private Date createdAt;