Ändern Sie den JSON-Feldnamen mit Jackson in Java

Jackson ist eine sehr verbreitete Bibliothek zur Handhabung von JSON und Serialisierung/Deserialisierung im Allgemeinen in Java- und Spring Boot-basierten Projekten.

Jackson handhabt Eigenschaftsnamen, indem er sie so wie sie sind JSON zuordnet – also propertyName in einem POJO wird ein entsprechendes haben propertyName im JSON-Format. Diese Konvention wird auch bei der Konvertierung von JSON in POJO befolgt, und wenn die Namen nicht übereinstimmen, kann die Konvertierung nicht durchgeführt werden.

Es gibt jedoch viele Fälle, in denen Sie möchten, dass die serialisierten JSON-Eigenschaften unterschiedliche Namen haben, z. B. bei der Standardisierung von Namenskonventionen für andere Dienste (mit Fällen wie snake_case, Anstatt von CamelCase) oder widersprüchliche Eigenschaftsnamen (a Customer kann eine haben firstName, genauso wie ein Agent – und ein Bericht kann beide enthalten firstName Eigenschaften und muss serialisiert werden).

Lassen Sie uns eine erstellen Book Klasse, mit ein paar einfachen Feldern:

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

Ändern Sie JSON-Feldnamen mit Jackson

Wenn normalerweise eine Instanz von a konvertiert wird Book in JSON schreiben wir den Wert des Objekts als JSON-String mit ObjectMapper:

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

Das führt zu:

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

Das title, author und releaseYear sind eine 1-zu-1-Zuordnung zum title, author und releaseYear Felder des POJO. Um den Namen einer JSON-Eigenschaft zu ändern und nach der Serialisierung beizubehalten, müssen Sie Ihr POJO nicht ändern! Es reicht aus, das entsprechende Feld mit zu kommentieren @JsonProperty, und geben Sie den JSON-Namen an:

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

Wenn wir nun das Objekt instanziieren und es in JSON konvertieren:

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

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

Der Code ergibt:

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

JSON-Feldnamen in der JSON-zu-POJO-Konvertierung ändern?

Es ist erwähnenswert, dass die Namensänderung nicht einseitig ist. Dieselbe Anmerkung funktioniert in beide Richtungen und kann ein eingehendes JSON mit unterschiedlichen Namen in ein gültiges Objekt überbrücken. Zum Beispiel ein JSON, das ein Buch mit darstellt book_title, würde nicht dem zugeordnet werden title Eigentum der Book Klasse standardmäßig, da sie nicht gleich sind.

Da wir kommentiert haben title as book_title – die Konvertierung funktioniert einwandfrei:

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

Das führt zu:

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

Hinweis: Um ein Objekt aus JSON zu erstellen, muss Ihre Klasse auch einen leeren Konstruktor haben. Jackson instanziiert zuerst das leere Objekt und füllt dann die Felder mit den Gettern und Settern.

Kommentieren Sie Getter und Setter mit @JsonProperty

Möchten Sie unterschiedliche Namen für die Serialisierung und Deserialisierung codieren? Sie können beispielsweise serialisieren Book in ein JSON mit bt den Titel des Buches bezeichnet, aber JSON mit verbrauchen book_title. Sie können die Getter und Setter der anpassen Book Klasse mit @JsonProperty Anmerkungen:

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

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

Auf diese Weise wird bei der Serialisierung die getBt() Methode wird die serialisieren title als ein bt Feld in JSON. Beim Lesen von JSON (Deserialisierung) müssen Sie a angeben book_title, das zugeordnet wird title.

Sehen Sie sich unseren praxisnahen, praktischen Leitfaden zum Erlernen von Git an, mit Best Practices, branchenweit akzeptierten Standards und einem mitgelieferten Spickzettel. Hören Sie auf, Git-Befehle zu googeln und tatsächlich in Verbindung, um es!

Hinweis: Beide bt und book_title wird dem zugeordnet title Feld, aber das macht nicht bt und book_title austauschbar. Jackson wird nicht in der Lage sein, zwischen ihnen umzuwandeln, ohne zuerst zu umzuwandeln title.

Jetzt können Sie ein Buch instanziieren, es serialisieren und einen anderen String in ein Buch deserialisieren mit:

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

Das führt zu:

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

Zusammenfassung

In diesem kurzen Tutorial haben wir uns angesehen, wie Jackson Objektfelder JSON zuordnet und wie Sie den Namen der Felder vor der Serialisierung ändern können. Wir haben auch die Idee untersucht, verschiedene JSON-Namen für die Serialisierung und Deserialisierung zu verwenden, indem wir die @JsonProperty Annotation auf Methodenebene statt auf Feldebene.

Zeitstempel:

Mehr von Stapelmissbrauch