본문 바로가기
IT/JSON

[JSON] - JSON Jackson 라이브러리 주요 어노테이션(Annotation) 사용법

by 차이나는 개발자 2022. 6. 28.
728x90
반응형

#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;

}

 

 

 

728x90
반응형

댓글