#JSON Jackson 라이브러리 주요 어노테이션(Annotation) 사용법
#pom.xml파일에 Jackson Databind 의존성 추가
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
#JSON Jackson 라이브러리 주요 어노테이션 종류
@JsonIgnoreProperties
-class 단위에서 json으로 직렬화, 역직렬화시 제외시킬 목적으로 사용합니다.
@JsonIgnoreProperties
public class JsonDTO {
private String id;
private String password;
private String name;
private int age;
private Date date;
}
@JsonIgnore
-필드 단위에서 json으로 직렬화, 역직렬화시 제외시킬 목적으로 사용합니다.
public class JsonDTO {
private String id;
@JsonIgnore
private String password;
private String name;
private int age;
private Date date;
}
@JsonProperty
-데이터 전송시 json 형식 데이터 키 값과 자바 객체의 필드명을 매핑 시켜준다.
public class JsonDTO {
// json 형식 데이터 goods_id = 자바 객체 필드 id;
@JsonProperty("goods_id")
private String id;
private String password;
private String name;
private int age;
private Date date;
}
@JsonInclude = objectMapper.setSerializationInclusion();
-자바 객체를 json 형식 데이터로 직렬화할때 옵션을 통해서 원하는 값만 포함시킬 수 있습니다. (default ALWAYS)
ALWAYS : 모든 값을 포함합니다.
NON_NULL : null 값을 제외합니다.
NON_EMPTY : null or "" or 빈 Collection or 빈 Array 값을 제외합니다.
NON_DEFAULT : NON_EMPTY + 기본 자료형이 default 값이거나 생성자로 생성된 데이터의 경우 제외합니다.
-JsonDTO
@JsonInclude(JsonInclude.Include.ALWAYS)
// @JsonInclude(JsonInclude.Include.NON_NULL)
// @JsonInclude(JsonInclude.Include.NON_EMPTY)
// @JsonInclude(JsonInclude.Include.NON_DEFAULT)
@Getter
@Setter
public class JsonDTO {
private String id;
private String password;
private String name;
private int age;
private Date date;
private String[] strArray;
private List<String> strList;
public JsonDTO() {
this.id = "hero";
this.password = "1234";
this.name = "";
this.age = 0;
this.date = new Date();
this.strArray = strArray;
this.strList = strList;
}
}
-JsonTest
public class JsonTest {
@Test
public void always() throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(new JsonDTO());
// {"id":"hero","password":"1234","name":"","age":0,"date":1656689308907,"strArray":null,"strList":null}
System.out.println(str);
}
@Test
public void non_null() throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(new JsonDTO());
// {"id":"hero","password":"1234","name":"","age":0,"date":1656689346377}
System.out.println(str);
}
@Test
public void non_empty() throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
String str = mapper.writeValueAsString(new JsonDTO());
// {"id":"hero","password":"1234","age":0,"date":1656689389601}
System.out.println(str);
}
@Test
public void non_default() throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
JsonDTO dto = new JsonDTO();
dto.setId("수정된 아이디");
String str = mapper.writeValueAsString(dto);
// {"id":"수정된 아이디","date":1656689827573}
System.out.println(str);
}
}
@JsonRootName
-자바 객체 class 위에 선언해서 지정한 이름으로 wrapping 해서 json 형식으로 반환합니다.
-JsonDTO
@JsonRootName(value = "member")
@Getter
@Setter
public class JsonDTO {
private String id;
private String password;
private String name;
private int age;
private Date date;
private String[] strArray;
private List<String> strList;
public JsonDTO() {
this.id = "hero";
this.password = "1234";
this.name = "";
this.age = 0;
this.date = new Date();
this.strArray = strArray;
this.strList = strList;
}
}
-테스트 메서드( 루트명으로 지정한 member가 생성되어서 기존 json 데이터를 포함하고 있는 것을 확인할 수 있습니다.
-@JsonRootName 어노테이션 사용시 mapper.enable(SerializationFeature.WRAP_ROOT_VALUE); 적용이 필요합니다.
@Test
public void jsonRootName() throws JsonProcessingException{
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
JsonDTO dto = new JsonDTO();
String str = mapper.writeValueAsString(dto);
// {"member":{"id":"hero","password":"1234","name":"","age":0,"date":1656691560642,"strArray":null,"strList":null}}
System.out.println(str);
}
@JsonAnyGetter(직렬화)
-Map 타입의 필드의 getter 메서드에 @JsonAnyGetter 어노테이션은 선언하면 ObjectMapper 클래스를 사용해서 json 형식으로 변환시 모든 객체 데이터가 "key":"value" 형식으로 변환됩니다.
-JsonDTO
@ToString
public class JsonDTO {
private String name;
private Map<String, Object> mapType;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JsonAnyGetter
public Map<String, Object> getMapType() {
return mapType;
}
public void setMapType(Map<String, Object> mapType) {
this.mapType = mapType;
}
}
-JsonTest
public class JsonTest {
@Test
public void jsonAnyGetter() throws JsonProcessingException {
Map<String, Object> map = new HashMap<>();
map.put("a", "1");
map.put("b", "2");
JsonDTO dto = new JsonDTO();
dto.setName("jack");
dto.setMapType(map);
// JsonDTO(name=jack, mapType={a=1, b=2})
System.out.println(dto);
String mapper = new ObjectMapper().writeValueAsString(dto);
// @JsonAnyGetter 적용
// {"name":"jack","a":"1","b":"2"}
System.out.println(mapper);
}
}
@JsonAnySetter(역직렬화)
-Map 타입 필드의 setter 메서드에 @JsonAnySetter를 사용하면 json 형식의 데이터들을 map 타입 형식으로 담을수 가 있습니다.
-JsonDTO
@ToString
public class JsonDTO {
public String name;
public Map<String, Object> mapType = new HashMap<>();
@JsonAnySetter
public void setMapType(String key, String value) {
mapType.put(key, value);
}
}
-JsonTest
public class JsonTest {
@Test
public void jsonAnySetter() throws IOException {
String json = "{\"name\":\"jack\",\"age\":\"30\",\"address\":\"japan\"}";
JsonDTO dto = new ObjectMapper().readerFor(JsonDTO.class).readValue(json);
// JsonDTO(name=jack, mapType={address=japan, age=30})
System.out.println(dto);
}
}
@JsonGetter, @JsonSetter
-자바 객체를 json 형식으로 직렬화시 @JsonGetter, @JsonSetter에 설정한 값으로 json 형식의 키값이 지정됩니다.
-JsonDTO
@ToString
public class JsonDTO {
public String name;
public int age;
@JsonGetter("myName")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
@JsonSetter("setMyAge")
public void setAge(int age) {
this.age = age;
}
}
-JsonTest
public class JsonTest {
@Test
public void jsonGetterSetter() throws IOException {
JsonDTO dto = new JsonDTO();
dto.setName("홍길동");
dto.setAge(30);
ObjectMapper mapper = new ObjectMapper();
String result = mapper.writeValueAsString(dto);
// {"myName":"홍길동","setMyAge":30}
System.out.println(result);
}
}
@JsonFormat
-@JsonFormat 어노테이션은 Jackson 라이브러리에서 제공하는 어노테이션으로 JSON 형식의 날짜, 시간값을 지정할 때 사용합니다.
-pattern : 날짜 형식을 지정합니다
-timezone : 특정 국가나 지역의 현지 시간(local time)을 지정합니다.
-jsonDTO
@Data
public class JsonDTO {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime time;
}
댓글