Java'da JSON Alan Adını Jackson ile değiştirin

Jackson, Java ve Spring Boot tabanlı projelerde genel olarak JSON ve seri hale getirme/seri hale getirmeyi işlemek için çok yaygın bir kütüphanedir.

Jackson, özellik adlarını JSON'a olduğu gibi eşleyerek işler - yani propertyName bir POJO'da karşılık gelen bir propertyName JSON'da. JSON'u POJO'ya dönüştürürken de bu kurala uyulur ve adlar eşleşmezse dönüştürme yapılamaz.

Ancak, seri hale getirilmiş JSON özelliklerinin farklı adlara sahip olmasını isteyebileceğiniz birçok durum vardır; örneğin, diğer hizmetler için adlandırma kurallarını standart hale getirmek (örneğin, snake_case, Yerine CamelCase) veya çakışan özellik adları (bir Customer olabilir firstName, tıpkı bir Agent – ve bir rapor her ikisini de içerebilir firstName özellikleri ve seri hale getirilmesi gerekiyor).

Hadi bir Book sınıf, birkaç basit alanla:

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;
    }
    
}

JSON Alan Adlarını Jackson ile Değiştirin

Genellikle bir örneğini dönüştürürken Book JSON'a, nesnenin değerini kullanarak bir JSON dizesi olarak yazardık. ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
        
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

Bunun sonucu:

{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}

The title, author ve releaseYear için 1'e 1 eşlemedir. title, author ve releaseYear POJO alanları. Bir JSON özelliğinin adını değiştirmek ve serileştirmeden sonra onu korumak için POJO'nuzu değiştirmenize gerek yoktur! ile ilgili alana açıklama eklemeniz yeterlidir. @JsonProperty, ve JSON adını girin:

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;
    }
    
}

Şimdi, nesneyi başlatıp JSON'a dönüştürdüğümüzde:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);

String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

Kod şu şekilde sonuçlanır:

{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}

JSON'dan POJO'ya Dönüştürmede JSON Alan Adları Değiştirilsin mi?

İsim değişikliğinin tek taraflı olmadığını belirtmekte fayda var. Aynı ek açıklama her iki şekilde de çalışır ve farklı adlara sahip gelen bir JSON'u geçerli bir nesneye köprüleyebilir. Örneğin, bir kitabı temsil eden bir JSON book_title, ile eşlenmeyecek title mülkiyeti Book sınıf, aynı olmadıkları için varsayılan olarak.

Açıklama yaptığımızdan title as book_title – dönüştürme gayet iyi çalışıyor:

Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);

Bunun sonucu:

Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}

Not: JSON'dan bir nesne oluşturmak için sınıfınızın da boş bir kurucuya sahip olması gerekir. Jackson önce boş nesneyi başlatır ve ardından alıcıları ve ayarlayıcıları kullanarak alanları doldurur.

Alıcılara ve Ayarlayıcılara @JsonProperty ile Açıklama Ekleyin

Serileştirme ve seri kaldırma için farklı adlar kodlamak istiyor musunuz? Örneğin, seri hale getirebilirsiniz Book ile bir JSON'a bt kitabın başlığını belirtmek, ancak JSON'u şununla kullanın: book_title. Alıcılarını ve ayarlayıcılarını özelleştirebilirsiniz. Book ile sınıf @JsonProperty ek açıklamalar:

@JsonProperty("bt")
public String getBt() {
    return title;
}

@JsonProperty("book_title")
public void setTitle(String title) {
    this.title = title;
}

Bu şekilde, serileştirildiğinde, getBt() yöntem serileştirecek title bir şekilde bt JSON'daki alan. JSON'dan okurken (serileştirme), bir book_title, eşlenen title.

En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!

Not: Her ikisi de bt ve book_title haritalandırılacak title alan, ancak bu yapmaz bt ve book_title değiştirilebilir Jackson, önce şuna dönüştürmeden aralarında dönüşüm gerçekleştiremez: title.

Artık bir kitabı başlatabilir, seri hale getirebilir ve başka bir String'in serisini kaldırarak bir kitap haline getirebilirsiniz:

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);

Bunun sonucu:

{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}

Sonuç

Bu kısa eğitimde, Jackson'ın nesne alanlarını JSON'a nasıl eşlediğine ve serileştirmeden önce alanların adını nasıl değiştirebileceğinize bir göz attık. Ayrıca, serileştirme ve seriden kaldırma için farklı JSON adları kullanma fikrini de araştırdık. @JsonProperty alan düzeyinden ziyade yöntem düzeyinde açıklama.

Zaman Damgası:

Den fazla Yığın kötüye kullanımı