문서의 이전 판입니다!
@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.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>
// 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();
@JsonFormat
(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss")
private Date createdAt;