[JSON, Java] Why, How - @JsonProperty, @JsonNaming

하쮸·2025년 1월 30일

Error, Why, What, How

목록 보기
13/70

제목에 적혀있는 두 에노테이션은 정확히 '언제 사용하고 어떤 기능을 하는 걸까?'에 대해서 정리한 글.

1. @JsonProperty.

  • JSON 데이터와 자바 객체의 필드명이 다를 경우 이를 매핑시켜주는 역할을 함.
@Getter
@Setter
public class UserRequest {
    private String name;
    private int age;
    private String phoneNumber;
@RequestMapping("/api")
@RestController
public class UserController {
    @PostMapping("/user/object")
    public void postMapping(@RequestBody UserRequest userRequest) {
        System.out.println(userRequest);
    }
}

  • 자바 클래스 필드명은 phoneNumber (카멜 케이스)로 정의되어 있지만 JSON으로 phone_number (스네이크 케이스)로 작성 되어있을 경우 서로 매핑이 안돼서 null이라고 뜸.
    • 이런 문제를 해결해주는 것이 바로 @JsonProperty 에노테이션.
@Getter
@Setter
public class UserRequest {
    private String name;
    private int age;

    @JsonProperty("phone_number")
    private String phoneNumber;
@RequestMapping("/api")
@RestController
public class UserController {
    @PostMapping("/user/object")
    public UserRequest postMapping(@RequestBody UserRequest userRequest) {
        System.out.println(userRequest);
        return userRequest;
    }
}

  • @JsonProperty("phone_number")를 해당 필드위에 작성해줌으로써 문제 해결.

2. @JsonNaming.

  • @JsonProperty가 필드 단위였다면 @JsonNaming에노테이션은 클래스 단위.

  • PropertyNamingStrategy은 deprecated돼서 PropertyNamingStrategies을 사용해야함.

@Getter
@Setter
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRequest {
    private String userName;
    private int age;


    private String phoneNumber;
@RequestMapping("/api")
@RestController
public class UserController {
    @PostMapping("/user/object")
    public UserRequest postMapping(@RequestBody UserRequest userRequest) {
        System.out.println(userRequest);
        return userRequest;
    }
}

  • 복수개의 필드를 잘 매핑해주는 모습.
  • 아래의 이미지들은 @JsonNaming에노테이션이 없을 경우.

profile
Every cloud has a silver lining.

0개의 댓글