Java Jackson Snake Case를 Camel Case로 역직렬화
1. Jackson 설치
pom.xml
파일에 Jackson 종속성을 추가한다.
1
2
3
4
5
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13</version>
</dependency>
2. 기본값을 사용하여 역직렬화
User 클래스의 예이다.
1
2
3
4
5
6
public class User {
private String firstName;
private String lastName;
// standard getters and setters
}
Snake Case 명명 표준(소문자 이름은 _
로 구분)을 사용하는 이 JSON을 로드한다.
1
2
3
4
{
"first_name": "Jackie",
"last_name": "Chan"
}
먼저 ObjectMapper를 사용하여 이 JSON을 역직렬화 해야 한다.
1
2
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(JSON, User.class);
그러나 이것을 시도하면 오류가 발생한다.
1
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "first_name" (class com.baeldung.jackson.snakecase.User), not marked as ignorable (2 known properties: "lastName", "firstName"])
불행하게도 Jackson은 JSON의 이름을 User의 필드 이름과 정확하게 일치시킬 수 없다.
다음으로 이 문제를 해결하는 세 가지 방법이다.
3. @JsonProperty Annotation 사용
클래스 필드에 @JsonProperty
주석을 사용하여 필드를 JSON의 정확한 이름에 매핑할 수 있다.
1
2
3
4
5
6
7
8
9
public class UserWithPropertyNames {
@JsonProperty("first_name")
private String firstName;
@JsonProperty("last_name")
private String lastName;
// standard getters and setters
}
이제 JSON을 UserWithPropertyNames로 역직렬화할 수 있다.
1
2
3
4
ObjectMapper objectMapper = new ObjectMapper();
UserWithPropertyNames user = objectMapper.readValue(JSON, UserWithPropertyNames.class);
assertEquals("Jackie", user.getFirstName());
assertEquals("Chan", user.getLastName());
4. @JsonNaming Annotation 사용
다음으로 클래스에 @JsonNaming
주석을 사용할 수 있으며 모든 필드는 Snake Case를 사용하여 역직렬화된다.
1
2
3
4
5
6
7
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
public class UserWithSnakeStrategy {
private String firstName;
private String lastName;
// standard getters and setters
}
그런 다음 JSON을 다시 역직렬화한다.
1
2
3
4
ObjectMapper objectMapper = new ObjectMapper();
UserWithSnakeStrategy user = objectMapper.readValue(JSON, UserWithSnakeStrategy.class);
assertEquals("Jackie", user.getFirstName());
assertEquals("Chan", user.getLastName());
5. ObjectMapper 구성
마지막으로 ObjectMapper의 setPropertyNamingStrategy 메소드를 사용하여 모든 직렬화에 대해 구성할 수 있다.
1
2
3
4
5
ObjectMapper objectMapper = new ObjectMapper()
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
User user = objectMapper.readValue(JSON, User.class);
assertEquals("Jackie", user.getFirstName());
assertEquals("Chan", user.getLastName());
보시다시피 이제 User 클래스에 주석이 없더라도 JSON을 원래 User 개체로 역직렬화할 수 있다.
다른 명명 규칙(예: kebab case)이 있으며 위의 솔루션도 마찬가지로 작동한다.
[출처 및 참고]
This post is licensed under CC BY 4.0 by the author.