Java에서 Jackson으로 JSON 필드 이름 변경

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, authorreleaseYear 에 대한 1:1 매핑입니다. title, authorreleaseYear 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() 메서드는 직렬화 titlebt JSON의 필드. JSON(역직렬화)에서 읽을 때 다음을 제공해야 합니다. book_title에 매핑됩니다. title.

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!

참고 : 모두 btbook_title 에 매핑됩니다 title 필드, 하지만 이것은 btbook_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 필드 수준이 아닌 메서드 수준의 주석.

타임 스탬프 :

더보기 스택카부스