Spring/Jackson

Jackson Annotation 정리 (4) (General Annotations)

긍.응.성 2020. 9. 17. 00:58
반응형

Jackson에서 사용하는 Annotation에 대해 정리한다. Baeldung (Jackson Annotation Example)에 정리된 글을 참고하였다.

4. Jackson General Annotations

4.1 @JsonProperty

@JsonProperty는 필드나 메서드 위에 선언되어 serialize/deserialize 될 때 매핑될 property명을 지정해 준다. API서버에서 가져온 응답이 자바의 명명규칙인 camelCase가 아닐 때 DTO에서 이를 매핑해주기위하여 사용한다.  

메서드 위에 선언될 경우 @JsonSetter와 @JsonGetter의 역할을 한다.

public class MyBean {
	public int id;
	private String name;
	
	@JsonProperty("name")
	public void setTheName(String name) {
		this.name = name;
	}
	
	@JsonProperty("name")
	public String getTheName() {
		return this.name;
	}
}

필드위에 선언될 경우 변수 theName를 name으로 매핑되도록 한다. 

public class MyBean {
	public int id;
	@JsonProperty("name")
	private String theName;

	public void setTheName(String name) {
		this.theName = name;
	}

	public String getTheName() {
		return this.theName;
	}
}
@Test
public void testJsonProperty() throws IOException {
	String json = "{\"id\":1,\"name\":\"changwoo\"}";

	ObjectMapper objectMapper = new ObjectMapper();
	MyBean myBean = objectMapper.readerFor(MyBean.class).readValue(json);

	System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(myBean));
}

/* return */
{
  "id" : 1,
  "name" : "changwoo"
}

 

4.2 @JsonFormat

@JsonFormat은 속성 값 직렬화에 대한 세부 정보를 설정할 수 있다. 가장 많이 함께 사용되는 객체는 java.util.Date이다. Date를 아무 설정 없이 출력하면 1970년 1월 1일부터의 지금까지 1/1000초의 값을 반환한다. 우리가 애플리케이션에서 이 데이터를 날짜 포맷으로 맞추어 사용하려면 매번 SimpleDateFormat을 지정해야하는 불편함이 존재한다. @JsonFormat 애노테이션을 통해 직렬화 과정에서 어떠한 pattern으로 출력될지를 지정해줄 수 있다.

shape=JsonFormat.Shape.Number로 지정하면 timeMillis의 값으로 출력된다.
public class EventWithFormat {
	public String name;

	@JsonFormat(
		shape = JsonFormat.Shape.STRING,
		pattern = "yyyy-MM-dd hh:mm:ss")
	public Date eventDate;

	public EventWithFormat(String name, Date eventDate) {
		this.name = name;
		this.eventDate = eventDate;
	}
}
@Test
public void testJsonFormat() throws ParseException, JsonProcessingException {
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	sdf.setTimeZone(TimeZone.getTimeZone("UTC"));

	String toParse = "2020-09-17 00:26:00";
	Date date = sdf.parse(toParse);
	EventWithSerializer event = new EventWithSerializer("party", date);

	System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(event));
}
/* @JsonFormat 적용 전*/
{
  "name" : "party",
  "eventDate" : 1600302360000
}

/* @JsonFormat 적용 후 */
{
  "name" : "party",
  "eventDate" : "2020-09-17 09:26:00"
}

 

4.3 @JsonUnwrapped

@JsonUnwrapped는 property를 serialize/deserialize 과정에서 평탄화(flattened)한다. 

public class UnwrappedUser {
	public int id;

	@JsonUnwrapped
	public Name name;

	public UnwrappedUser(int id, Name name) {
		this.id = id;
		this.name = name;
	}

	public static class Name {
		public String firstName;
		public String lastName;

		public Name(String firstName, String lastName) {
			this.firstName = firstName;
			this.lastName = lastName;
		}
	}
}
@Test
public void testJsonUnwrapped() throws JsonProcessingException {
	UnwrappedUser.Name name = new UnwrappedUser.Name("Son", "changwoo");
	UnwrappedUser user = new UnwrappedUser(1, name);

	System.out.println(new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(user));
}
/* @JsonUnwrapped 적용 전 */
{
  "id" : 1,
  "name" : {
    "firstName" : "Son",
    "lastName" : "changwoo"
  }
}

/* @JsonUnwrapped 적용 전 */
{
  "id" : 1,
  "firstName" : "Son",
  "lastName" : "changwoo"
}
반응형