Jackson은 Java 및 Spring Boot 기반 프로젝트에서 일반적으로 JSON 및 직렬화/역직렬화를 처리하기 위한 매우 일반적인 라이브러리입니다.
Jackson은 속성 이름을 있는 그대로 JSON에 매핑하여 속성 이름을 처리합니다.
propertyName
POJO에는 해당하는propertyName
JSON에서. JSON을 POJO로 변환할 때도 이 규약을 따르며, 이름이 일치하지 않으면 변환이 불가능하다.
그러나 다른 서비스에 대한 명명 규칙 표준화(예: snake_case
대신의 CamelCase
) 또는 충돌하는 속성 이름(a Customer
를 가질 수있다 firstName
, 그대로 Agent
– 보고서에는 다음 두 가지가 모두 포함될 수 있습니다. firstName
속성이며 직렬화해야 함).
를 만들어 보자 Book
몇 가지 간단한 필드가 있는 클래스:
public class Book {
private String title;
private String author;
private int releaseYear;
public Book() {}
public Book(String title, String author, int releaseYear) {
this.title = title;
this.author = author;
this.releaseYear = releaseYear;
}
}
Jackson으로 JSON 필드 이름 변경
일반적으로 인스턴스를 변환할 때 Book
JSON에 객체의 값을 다음을 사용하여 JSON 문자열로 씁니다. ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
결과 :
{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}
XNUMXD덴탈의 title
, author
과 releaseYear
에 대한 1:1 매핑입니다. title
, author
과 releaseYear
POJO의 필드. JSON 속성의 이름을 변경하고 직렬화 후 유지하기 위해 POJO를 변경할 필요가 없습니다! 관련 필드에 주석을 추가하는 것으로 충분합니다. @JsonProperty
, JSON 이름을 제공합니다.
public class Book {
@JsonProperty("book_title")
private String title;
@JsonProperty("book_author")
private String author;
@JsonProperty("book_release_year")
private int releaseYear;
public Book(){}
public Book(String title, String author, int releaseYear) {
this.title = title;
this.author = author;
this.releaseYear = releaseYear;
}
}
이제 객체를 인스턴스화하고 JSON으로 변환할 때:
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
코드 결과:
{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}
JSON에서 POJO로의 변환에서 JSON 필드 이름을 변경하시겠습니까?
이름 변경이 일방적이지 않다는 점은 주목할 가치가 있습니다. 동일한 주석이 양방향으로 작동하며 다른 이름을 가진 수신 JSON을 유효한 객체에 연결할 수 있습니다. 예를 들어, 다음이 포함된 책을 나타내는 JSON은 book_title
, 매핑되지 않음 title
재산 Book
클래스는 기본적으로 동일하지 않기 때문에 기본적으로 제공됩니다.
주석을 달았기 때문에 title
as book_title
– 변환이 잘 작동합니다.
Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);
결과 :
Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}
참고 : JSON에서 객체를 생성하려면 클래스에도 빈 생성자가 있어야 합니다. Jackson은 먼저 빈 개체를 인스턴스화한 다음 getter 및 setter를 사용하여 필드를 채웁니다.
@JsonProperty로 Getter 및 Setter에 주석 달기
직렬화 및 역직렬화에 대해 다른 이름을 인코딩하시겠습니까? 예를 들어 직렬화할 수 있습니다. Book
JSON으로 bt
책의 제목을 나타내지만 다음과 함께 JSON을 사용합니다. book_title
. getter와 setter를 사용자 정의할 수 있습니다. Book
수업 @JsonProperty
주석 :
@JsonProperty("bt")
public String getBt() {
return title;
}
@JsonProperty("book_title")
public void setTitle(String title) {
this.title = title;
}
이렇게 하면 직렬화될 때 getBt()
메서드는 직렬화 title
등 bt
JSON의 필드. JSON(역직렬화)에서 읽을 때 다음을 제공해야 합니다. book_title
에 매핑됩니다. title
.
모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!
참고 : 모두 bt
과 book_title
에 매핑됩니다 title
필드, 하지만 이것은 bt
과 book_title
교환 가능. Jackson은 먼저 다음으로 변환하지 않고는 둘 사이를 변환할 수 없습니다. title
.
이제 다음을 사용하여 책을 인스턴스화하고 직렬화하고 다른 문자열을 책으로 역직렬화할 수 있습니다.
ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);
String input = "{"author":"Max Tegmark","releaseYear":2017,"book_title":"Life 3.0"}";
Book bookReconstructed = mapper.readValue(input, Book.class);
System.out.print(bookReconstructed);
결과 :
{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}
결론
이 짧은 자습서에서는 Jackson이 개체 필드를 JSON에 매핑하는 방법과 직렬화 전에 필드 이름을 변경하는 방법을 살펴보았습니다. 또한 직렬화 및 역직렬화에 다른 JSON 이름을 사용하는 아이디어를 살펴보았습니다. @JsonProperty
필드 수준이 아닌 메서드 수준의 주석.