Wijzig JSON-veldnaam met Jackson in Java

Jackson is een veelgebruikte bibliotheek voor het afhandelen van JSON en serialisatie/deserialisatie in het algemeen in op Java en Spring Boot gebaseerde projecten.

Jackson verwerkt eigendomsnamen door ze zoals ze zijn toe te wijzen aan JSON โ€“ dus propertyName in een POJO heeft een overeenkomstige propertyName in JSON. Deze conventie wordt ook gevolgd bij het converteren van JSON naar POJO, en als de namen niet overeenkomen, kan de conversie niet worden uitgevoerd.

Er zijn echter veel gevallen waarin u wilt dat de geserialiseerde JSON-eigenschappen verschillende namen hebben, zoals het standaardiseren van naamgevingsconventies voor andere services (met gevallen zoals snake_casegebruik je, in plaats van CamelCase) of conflicterende eigenschapsnamen (a Customer kan hebben firstName, net als een Agent โ€“ en een rapport kan beide bevatten: firstName eigenschappen en moet worden geserialiseerd).

Laten we een maken Book class, met een paar eenvoudige velden:

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

Wijzig JSON-veldnamen met Jackson

Bij het gewoonlijk converteren van een instantie van a Book in JSON, zouden we de waarde van het object als een JSON-tekenreeks schrijven met ObjectMapper:

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

Dit resulteert in:

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

De title, author en releaseYear zijn een 1-op-1 mapping naar de title, author en releaseYear velden van de POJO. Om de naam van een JSON-eigenschap te wijzigen en deze te behouden na serialisatie, is het niet nodig om uw POJO! Het volstaat om het relevante veld te annoteren met @JsonProperty, en geef de JSON-naam op:

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

Wanneer we nu het object instantiรซren en naar JSON converteren:

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

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

De code resulteert in:

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

JSON-veldnamen wijzigen in JSON-naar-POJO-conversie?

Het is vermeldenswaard dat de naamsverandering niet eenzijdig is. Dezelfde annotatie werkt in beide richtingen en kan een inkomende JSON met verschillende namen overbruggen tot een geldig object. Een JSON die bijvoorbeeld een boek vertegenwoordigt met book_title, zou niet worden toegewezen aan de title eigendom van de Book klasse standaard, omdat ze niet hetzelfde zijn.

Sinds we geannoteerd hebben title as book_title โ€“ de conversie werkt prima:

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

Dit resulteert in:

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

Opmerking: Om een โ€‹โ€‹object uit JSON te construeren, moet uw klasse ook een lege constructor hebben. Jackson maakt eerst het lege object en vult vervolgens de velden met behulp van de getters en setters.

Annoteer Getters en Setters met @JsonProperty

Wilt u verschillende namen coderen voor serialisatie en deserialisatie? U kunt bijvoorbeeld serialiseren Book in een JSON met bt de titel van het boek aanduidend, maar gebruik JSON met book_title. U kunt de getters en setters van de . aanpassen Book klas met @JsonProperty annotaties:

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

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

Op deze manier, wanneer geserialiseerd, de getBt() methode zal de . serialiseren title een bt veld in JSON. Bij het lezen van JSON (deserialiseren), moet u een book_title, dat wordt toegewezen aan title.

Bekijk onze praktische, praktische gids voor het leren van Git, met best-practices, door de industrie geaccepteerde normen en bijgevoegd spiekbriefje. Stop met Googlen op Git-commando's en eigenlijk leren het!

Opmerking: Te gebruiken zowel bt en book_title zal worden toegewezen aan de title veld, maar dit maakt niet bt en book_title uitwisselbaar. Jackson kan er niet tussen converteren zonder eerst te converteren naar title.

Nu kun je een boek instantiรซren, het serialiseren en een andere string deserialiseren in een boek met:

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

Dit resulteert in:

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

Conclusie

In deze korte zelfstudie hebben we bekeken hoe Jackson objectvelden toewijst aan JSON en hoe u de naam van de velden kunt wijzigen vรณรณr serialisatie. We hebben ook het idee onderzocht om verschillende JSON-namen te gebruiken voor serialisatie en deserialisatie, met behulp van de @JsonProperty annotatie op methodeniveau in plaats van veldniveau.

Tijdstempel:

Meer van Stapelmisbruik