@RestController에서 엔티티 매핑시 자주 사용되는 JSON과 관련된 어노테이션에 대해 간단히 정리해 보았습니다. @JsonProperty , @JsonIgnore, @JsonAnyGetter, @JsonAnySetter, @JsonAnyGetter, @JsonGetter, @JsonSetter, @JsonAutoDetect, @JsonInclude, @JsonUnwrapped
2. @JsonProperty : JSON으로 변환시 속성이름 변경
public class Emp {
@JsonProperty(“name”)
public String ename;
}
{ “name” : “SMITH” }
3. @JsonIgnore : JSON으로 변환시 무시한다.
public class Emp {
@JsonProperty(“name”)
public String ename;
@JsonIgnore
public int sal;
}
{ “name” : “SMITH” }
4. public class Emp {
public String ename;
private Map<String, String>
properties;
@JsonAnyGetter
public Map<String, String>
getProperties() {
return properties;
}
}
@Test
public void test() throws JsonProcessingException {
Emp emp = new Emp(“SMITH");
emp.add(“key1", "val1");
emp.add(“key2", "val2");
String result = new
ObjectMapper().writeValueAsString(emp);
assertThat(result, containsString(“key1"));
assertThat(result, containsString("val1"));
}
{
“ename":“SMITH",
“key2":"val2",
“key1":"val1"
}
@JsonAnyGetter : Map 타입필드에 대해 JSON
변환시 key, value를 일반속성처럼 변환 시켜준다.
5. public class Emp {
public String ename;
private Map<String, String> properties;
@JsonAnySetter
public void add(String key, String value)
{
return properties.put(key, value);
}
}
@Test
public void test() throws JsonProcessingException,
IOException {
String json =
"{“ename":“SMITH",“key2":"val2",“key1":"val1"}";
Emp emp = new
ObjectMapper().readerFor(Emp.class).readValue(json);
assertEquals(“SMITH", emp.ename);
assertEquals("val2",
emp.getProperties().get(“key2"));}
{
“ename":“SMITH",
“key2":"val2",
“key1":"val1"
}
@JsonAnySetter : 역직렬화시 JSON 속성을 map 필드에
대해 적용한다.
6. @JsonGetter : Jackson에게 어떤 필드의 값에 대해 필드로 다이렉트 접근해서
가지고 오지말고 기술한 메소드의 게터 메소드로 접근해서 가지고 오라고 알린
다.
@JsonSetter : 역직렬화시 JSON 속성을 필드에 할당하기 위해 어떤 필드의 세터
임을 지정한다.
public class Emp {
private long empno = 9999;
@JsonGetter(“empno")
public long empno() { return this.empno; }
@JsonSetter(“empno")
public void empno(long personId) { this.empno = empno; }
}
{“empno":9999}
7. @JsonAutoDetect : 어떤 필드/메소드를 JSON으로 변환할지를
지정한다. Visibility는 ANY, DEFAULT, NON_PRIVATE, NONE,
PROTECTED_AND_PRIVATE, PUBLIC_ONLY 값을 가진다.
// 필드는 JSON으로 변환하지 말고 public getter method 만 JSON으로 변환하라는 의미
@JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.PUBLIC_ONLY)
//모든 필드를 변환
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY )
public class Emp {
private long empno = 7369;
public String ename = “SMITH”;
}
8. @JsonInclude : Jackson에게 필드값 존재 유무에 따라 JSON 출력시 포
함할 지의 여부를 지정한다.
ALWAYS : 속성의 값에 의존하지 말고 항상 포함해라
NOT_EMPTY : NULL 또는 값이빈 경우가 아니면 포함해라
NOT_NULL : 널이아니면 포함해라.
NON_DEFAULT : 빈의 기본생성자로 정의된 필드값과 다르게 변경된 필드만 포함해라
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class Emp {
public long empno = 9999;
public String ename = null;
}
{ “empno” : 9999}
9. @JsonUnwrapped : Jackson에게 어떤 필드의 값
에 대해 싸지 말고 풀어헤쳐 달라는 의미.
public class Emp {
public int age;
public Ename ename;
}
public class Ename {
public String first, last;
}
{
"age" : 18,
“ename" : {
"first" : “JongCheol",
"last" : “Lee"
}
}
public class Emp {
public int age;
@JsonUnwrapped
public Ename ename;
}
public class Ename {
public String first, last;
}
{
"age" : 18,
"first" : “JongCheol",
"last" : “Lee"
}
}