Αλλάξτε το όνομα πεδίου JSON με το Jackson στην Java

Το Jackson είναι μια πολύ κοινή βιβλιοθήκη για το χειρισμό JSON και γενικά για σειριοποίηση/αποσειριοποίηση σε έργα που βασίζονται σε Java και Spring Boot.

Ο Jackson χειρίζεται τα ονόματα ιδιοτήτων αντιστοιχίζοντάς τα ως έχουν στο JSON – έτσι propertyName σε ένα POJO θα έχει ένα αντίστοιχο propertyName σε JSON. Αυτή η σύμβαση τηρείται και κατά τη μετατροπή JSON σε POJO, και αν τα ονόματα δεν ταιριάζουν, η μετατροπή δεν μπορεί να γίνει.

Ωστόσο, υπάρχουν πολλές περιπτώσεις στις οποίες θα θέλατε οι σειριακές ιδιότητες JSON να έχουν διαφορετικά ονόματα, όπως η τυποποίηση συμβάσεων ονομασίας για άλλες υπηρεσίες (χρησιμοποιώντας περιπτώσεις όπως snake_case, αντί CamelCase) ή αντικρουόμενα ονόματα ιδιοτήτων (α 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;
    }
    
}

Αλλάξτε τα ονόματα πεδίων JSON με τον Jackson

Όταν συνήθως μετατρέπεται ένα στιγμιότυπο του a 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}

Η title, author και releaseYear είναι μια αντιστοίχιση 1 προς 1 στο title, author και releaseYear πεδία του 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 στη μετατροπή JSON-σε-POJO;

Αξίζει να σημειωθεί ότι η αλλαγή ονόματος δεν είναι μονόπλευρη. Ο ίδιος σχολιασμός λειτουργεί και με τους δύο τρόπους και μπορεί να γεφυρώσει ένα εισερχόμενο 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, η κλάση σας πρέπει επίσης να έχει έναν κενό κατασκευαστή. Ο Τζάκσον εγκαινιάζει πρώτα το κενό αντικείμενο και στη συνέχεια συμπληρώνει τα πεδία χρησιμοποιώντας τους λήπτες και τους ρυθμιστές.

Σημειώστε Getters και Setters με το @JsonProperty

Θέλετε να κωδικοποιήσετε διαφορετικά ονόματα για σειριοποίηση και αποσειροποίηση; Για παράδειγμα, μπορείτε να κάνετε σειριακή Book σε JSON με bt που δηλώνει τον τίτλο του βιβλίου, αλλά καταναλώνει το JSON με book_title. Μπορείτε να προσαρμόσετε τους δέκτες και τους ρυθμιστές του Book τάξη με @JsonProperty σχολιασμοί:

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

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

Με αυτόν τον τρόπο, όταν γίνεται σε σειρά, το getBt() μέθοδος θα σειριοποιήσει το title ως bt πεδίο σε JSON. Όταν διαβάζετε από JSON (αποσχεδιασμός), θα πρέπει να δώσετε ένα book_title, που αντιστοιχίζεται σε title.

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Σημείωση: Και τα δύο bt και book_title θα αντιστοιχιστεί στο title πεδίο, αλλά αυτό δεν κάνει bt και book_title ανταλλάξιμος. Ο Τζάκσον δεν θα μπορεί να κάνει μετατροπή μεταξύ τους χωρίς πρώτα να κάνει μετατροπή σε title.

Τώρα, μπορείτε να δημιουργήσετε ένα βιβλίο, να το σειριοποιήσετε και να μετατρέψετε ένα άλλο String σε βιβλίο με:

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 σχολιασμός σε επίπεδο μεθόδου και όχι σε επίπεδο πεδίου.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse