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 overeenkomstigepropertyName
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_case
gebruik 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.