Jackson의 @JsonProperty 어노테이션은 JSON 직렬화(Serialization) 또는 역직렬화(Deserialization) 과정에서 특정 프로퍼티나 메서드에 적용하여 사용합니다. 이 어노테이션은 선택적인 'name' 파라미터를 받을 수 있으며, Java 클래스의 프로퍼티 이름과 JSON의 'key' 이름이 서로 다를 때 특히 유용합니다. 기본적으로 key 이름과 프로퍼티 이름이 일치하면 값이 자동으로 매핑되지만, 이름이 다른 경우 이 어노테이션으로 매핑 관계를 직접 지정할 수 있습니다.
아래 예제에서는 @JsonProperty 어노테이션을 사용하여 JSON 출력 시 필드 이름을 원하는 형태로 변경하는 방법을 살펴보겠습니다.
예제 코드
import java.io.IOException;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.annotation.JsonProperty;
public class JsonPropertyAnnotationTest {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
User user = new User("Sai", "Adithya", "9959984000", "0402358700");
String data = mapper.writeValueAsString(user);
System.out.println(data);
}
}
// User 클래스
class User {
@JsonProperty("first-name")
public String firstName;
@JsonProperty("last-name")
public String lastName;
@JsonProperty("mobile-phone")
public String mobilePhone;
@JsonProperty("home_phone")
public String workPhone;
public User(String firstName, String lastName, String mobilePhone, String workPhone) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.mobilePhone = mobilePhone;
this.workPhone = workPhone;
}
}실행 결과
{
"first-name" : "Sai",
"last-name" : "Adithya",
"mobile-phone" : "9959984000",
"home_phone" : "0402358700"
}위 실행 결과를 보면, Java 클래스의 원래 필드 이름인 firstName, lastName, mobilePhone, workPhone이 각각 first-name, last-name, mobile-phone, home_phone으로 변경되어 출력된 것을 확인할 수 있습니다.
주요 포인트 정리
- @JsonProperty("이름") 형태로 지정한 문자열이 JSON의 key 이름으로 사용됩니다.
- 어노테이션은 필드뿐만 아니라 getter/setter 메서드에도 적용할 수 있습니다.
- 역직렬화 시에도 동일하게 적용되므로, JSON의 key와 Java 필드 이름이 다르더라도 올바르게 매핑됩니다.
- kebab-case(
first-name), snake_case(home_phone) 등 어떤 네이밍 규칙이든 자유롭게 지정할 수 있습니다.