Gson — τι είναι, βιβλιοθήκη JSON για Java και Kotlin

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-03-15 Χρόνος ανάγνωσης: 8 λεπ

Gson — η βιβλιοθήκη της Google για σειριοποίηση αντικειμένων Java σε JSON και αντίστροφα, που χρησιμοποιείται ευρέως στην ανάπτυξη Android. Επιτρέπει τη μετατροπή σύνθετων γράφων αντικειμένων σε συμπαγείς συμβολοσειρές JSON χωρίς χειροκίνητη σύνταξη αναλυτών. Σύμφωνα με τα δεδομένα του Google Gson, 2024, η βιβλιοθήκη έχει πάνω από 23 χιλιάδες αστέρια στο GitHub και παραμένει μία από τις πιο δημοφιλείς λύσεις για εργασία με JSON στο οικοσύστημα Java και Kotlin.

Κύρια σημεία

  • Gson — βιβλιοθήκη της Google για σειριοποίηση JSON σε Java και Kotlin
  • fromJson — αποσειριοποίηση JSON σε αντικείμενο Java οποιουδήποτε τύπου
  • toJson — σειριοποίηση αντικειμένου σε συμβολοσειρά JSON
  • @SerializedName — σχολιασμός για σύνδεση κλειδιού JSON με πεδίο κλάσης
  • TypeToken — εργασία με γενικούς τύπους και παραμετροποιημένους τύπους

Τι είναι το Gson

Gson — είναι μια βιβλιοθήκη Java που αναπτύχθηκε από την Google για μετατροπή αντικειμένων σε αναπαράσταση JSON και αντίστροφα. Χρησιμοποιει ανάκλαση (reflection) για την ανάλυση της δομής των κλάσεων, επιτρέποντας εργασία χωρίς προηγούμενη ρύθμιση. Το Gson υποστηρίζει αυθαίρετα αντικείμενα Java, συλλογές, πίνακες, γενικούς τύπους και ένθετες κλάσεις. Η βιβλιοθήκη δεν απαιτεί σχολιασμούς για βασική χρήση, αλλά τους παρέχει για λεπτομερή ρύθμιση. Το κύριο μειονέκτημα της ανάκλασης είναι η μείωση της απόδοσης κατά την αρχικοποίηση και η αδυναμία βελτιστοποίησης στο στάδιο μεταγλώττισης, που είναι ιδιαίτερα αισθητή κατά την ψυχρή εκκίνηση εφαρμογής Android κατά την αποσειριοποίηση εκατοντάδων μοντέλων. Παρά ταύτα, το Gson παραμένει αξιόπιστη επιλογή για τα περισσότερα έργα χάρη στη σταθερότητα και την εκτεταμένη τεκμηρίωση.

Ιστορία και θέση στο οικοσύστημα

Το Gson κυκλοφόρησε από την Google το 2008 και γρήγορα έγινε το de facto πρότυπο για JSON σε εφαρμογές Android. Πριν από την εμφάνιση των Moshi και kotlinx.serialization, το Gson παρέμενε η μόνη δημοφιλής επιλογή για έργα Kotlin. Η απλότητα σύνδεσης — προσθήκη μιας εξάρτησης στο build.gradle — και η απουσία υποχρεωτικών σχολιασμών έκαναν το Gson δημοφιλές μεταξύ προγραμματιστών όλων των επιπέδων.

groovy
// Προσθήκη Gson στο build.gradle
dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}

// Βασική χρήση
data class User(
    val id: Int,
    val name: String,
    val email: String
)

val gson = Gson()
val user = User(1, "John", "john@test.com")
val json = gson.toJson(user)
println(json) // {"id":1,"name":"John","email":"john@test.com"}

Εκτός από βασική σειριοποίηση, το Gson παρέχει GsonBuilder για ρύθμιση συμπεριφοράς: μορφοποίηση ημερομηνιών, απενεργοποίηση διαφυγής HTML, μητρώο κλειδιών και προσαρμοσμένες παρουσίες. Το GsonBuilder επιτρέπει επίσης την εγγραφή προσαρμοσμένων JsonSerializer και JsonDeserializer για τύπους που η βιβλιοθήκη δεν μπορεί να επεξεργαστεί αυτόματα. Η ευελιξία ρύθμισης καθιστά το GsonBuilder απαραίτητο και χρήσιμο εργαλείο κατά την προσαρμογή της βιβλιοθήκης σε συγκεκριμένες απαιτήσεις έργου στη σύγχρονη ανάπτυξη Android.

Βασικές λειτουργίες toJson και fromJson

toJson μετατρέπει ένα αντικείμενο Java σε συμβολοσειρά JSON, αναλύοντας τα πεδία του μέσω ανάκλασης. Από προεπιλογή, το Gson περιλαμβάνει όλα τα πεδία εκτός από transient και static. Η μέθοδος υποστηρίζει όλους τους τύπους: πρωτόγονους, αντικείμενα, συλλογές και πίνακες. fromJson εκτελεί την αντίστροφη μετατροπή, λαμβάνοντας μια συμβολοσειρά JSON και την κλάση του αντικειμένου-στόχου, και επιστρέφει μια παρουσία με συμπληρωμένα πεδία.

Μετατροπή αντικειμένου σε JSON

Κατά τη σειριοποίηση, το Gson διατρέχει αναδρομικά όλα τα πεδία του αντικειμένου, συμπεριλαμβανομένων των ένθετων. Οι κυκλικές αναφορές οδηγούν σε StackOverflowError, επομένως πρέπει να εξαιρούνται μέσω του σχολιασμού @Expose ή προσαρμοσμένου προσαρμογέα. Για συλλογές, το Gson διατηρεί τον τύπο στοιχείων, αλλά κατά την αποσειριοποίηση λίστας με γενικούς τύπους απαιτείται TypeToken για διατήρηση πληροφοριών τύπου.

kotlin
// data class με ένθετο αντικείμενο
data class Address(
    val city: String,
    val street: String
)

data class Employee(
    val id: Int,
    val name: String,
    val address: Address
)

val gson = Gson()
val employee = Employee(1, "Alice",
    Address("New York", "5th Ave"))

// Σειριοποίηση σε JSON
val json = gson.toJson(employee)

// Αποσειριοποίηση από JSON
val jsonString = """
{"id":2,"name":"Bob","address":{"city":"London","street":"Baker St"}}
"""
val parsed = gson.fromJson(jsonString, Employee::class.java)

Σχολιασμοί και ρύθμιση

Gson παρέχει ένα σύνολο σχολιασμών για διαχείριση της διαδικασίας σειριοποίησης. @SerializedName καθορίζει το όνομα κλειδιού JSON που διαφέρει από το όνομα πεδίου. @Expose διαχειρίζεται την συμπερίληψη πεδίου στη σειριοποίηση: το Gson που δημιουργείται μέσω GsonBuilder.excludeFieldsWithoutExposeAnnotation() θα επεξεργάζεται μόνο πεδία με @Expose. @Since και @Until ελέγχουν την έκδοση πεδίων.

@SerializedName και @Expose

Ο σχολιασμός @SerializedName λύνει το πρόβλημα αναντιστοιχίας ονομάτων: ο διακομιστής μπορεί να χρησιμοποιεί snake_case, ενώ στον κώδικα υιοθετείται το camelCase. Ο σχολιασμός δέχεται μια τιμή και προαιρετικές εναλλακτικές για συμβατότητα προς τα πίσω. @Expose επιτρέπει την απόκρυψη ευαίσθητων πεδίων (κωδικοί πρόσβασης, διακριτικά) από τη σειριοποίηση, χαρακτηρίζοντάς τα ως @Expose(serialize = false). Εκτός από τη συμπερίληψη και εξαίρεση, το @Expose μπορεί να συνδυαστεί με GsonBuilder.excludeFieldsWithoutExposeAnnotation για δημιουργία λευκής λίστας πεδίων, που βοηθά στον έλεγχο της επιφάνειας επίθεσης κατά τη σειριοποίηση αντικειμένων με μεγάλο αριθμό πεδίων.

kotlin
// Μοντέλο με σχολιασμούς Gson
data class UserResponse(
    @SerializedName("user_id")
    val userId: Int,

    @SerializedName("full_name",
        alternate = [Alternative("name")])
    val fullName: String,

    @Expose(serialize = false)
    val password: String
)

// Gson με φιλτράρισμα @Expose
val gson = GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation()
    .setPrettyPrinting()
    .create()

val user = UserResponse(1, "John", "secret123")
println(gson.toJson(user))
// {"user_id":1,"full_name":"John"} — password excluded

Εργασία με γενικούς τύπους

Το πρόβλημα των γενικών τύπων σε Java και Kotlin έγκειται στη διαγραφή τύπων κατά τη μεταγλώττιση. Όταν το Gson αποσειριοποιεί List<User>, δεν γνωρίζει τον τύπο στοιχείου και επιστρέφει List<Map<String, Any>>. Για να διατηρηθούν πληροφορίες τύπου, το Gson παρέχει TypeToken — μια αφηρημένη κλάση που συλλαμβάνει την παράμετρο τύπου μέσω μιας ανώνυμης κλάσης. Χωρίς TypeToken, ο προγραμματιστής θα έπρεπε να μετατρέπει χειροκίνητα κάθε στοιχείο από Map στον τύπο-στόχο, οδηγώντας σε ογκώδη κώδικα και απώλεια απόδοσης.

TypeToken για λίστες

TypeToken λύνει το πρόβλημα διαγραφής τύπων. Ο προγραμματιστής δημιουργεί έναν ανώνυμο απόγονο του TypeToken με την απαιτούμενη παράμετρο τύπου, και το Gson χρησιμοποιεί πληροφορίες από την υπογραφή της κλάσης για σωστή αποσειριοποίηση. Το TypeToken λειτουργεί επίσης με Map, Set και οποιουσδήποτε άλλους παραμετροποιημένους τύπους, συμπεριλαμβανομένων των ένθετων γενικών τύπων. Συγκεκριμένα, για Map<String, List<User>> απαιτείται TypeToken με πλήρη υπογραφή του ένθετου τύπου, διαφορετικά το Gson αποσειριοποιεί τις τιμές ως List<Map<String, Any>> αντί για List<User>.

kotlin
// TypeToken για αποσειριοποίηση λίστας
data class Product(
    val id: Int,
    val title: String,
    val price: Double
)

val jsonArray = """
[
    {"id":1,"title":"Phone","price":599.0},
    {"id":2,"title":"Laptop","price":1299.0}
]
"""

val gson = Gson()
val listType = object : TypeToken<List<Product>>() {}
val products: List<Product> =
    gson.fromJson(jsonArray, listType.type)

// Προσαρμοσμένος αποσειριοποιητής
class LocalDateAdapter :
    JsonDeserializer<LocalDate> {

    override fun deserialize(
        json: JsonElement,
        typeOfT: java.lang.reflect.Type,
        context: JsonDeserializationContext
    ): LocalDate {
        return LocalDate.parse(json.asString)
    }
}

Για προσαρμοσμένη λογική σειριοποίησης, το Gson υποστηρίζει τις διεπαφές JsonSerializer και JsonDeserializer. Καταχωρούνται μέσω GsonBuilder.registerTypeAdapter() και επιτρέπουν την επεξεργασία τύπων που η βιβλιοθήκη δεν μπορεί να σειριοποιήσει αυτόματα: ημερομηνίες Java 8, Enum με μη τυπικές τιμές ή κλάσεις τρίτων χωρίς πρόσβαση στον πηγαίο κώδικα. Κατά την υλοποίηση προσαρμογέα, είναι σημαντική η παρακολούθηση της απόδοσης: η κλήση ανάκλασης εντός του προσαρμοσμένου προσαρμογέα ακυρώνει τα πλεονεκτήματα της χειροκίνητης διαχείρισης, επομένως προτιμώνται οι άμεσες κλήσεις μεθόδων και πεδίων. Στο οικοσύστημα Gson υπάρχει επίσης η ενότητα gson-extras που παρέχει προσαρμογείς για συνήθεις τύπους όπως UUID, Optional και τύπους ημερομηνίας Joda-Time.

Ρύθμιση μέσω GsonBuilder

Το GsonBuilder παρέχει δεκάδες μεθόδους για λεπτομερή ρύθμιση της σειριοποίησης. setPrettyPrinting προσθέτει εσοχές και νέες γραμμές στο JSON εξόδου για αναγνωσιμότητα. disableHtmlEscaping απενεργοποιεί τη διαφυγή χαρακτήρων HTML σε συμβολοσειρές. setDateFormat ορίζει τη μορφή ημερομηνίας, που είναι κρίσιμη κατά την εργασία με διακομιστές που χρησιμοποιούν μη τυπική αναπαράσταση χρόνου. setLenient ενεργοποιεί τη χαλαρή λειτουργία ανάλυσης που αγνοεί ορισμένα σφάλματα μορφοποίησης JSON. addDeserializationExclusionStrategy επιτρέπει τον προγραμματισμένο αποκλεισμό πεδίων από την αποσειριοποίηση βάσει προσαρμοσμένων στρατηγικών. Για εντοπισμό σφαλμάτων, η μέθοδος setPrettyPrinting είναι χρήσιμη σε συνδυασμό με καταγραφή — καθιστά τις απαντήσεις JSON ευανάγνωστες στα αρχεία καταγραφής και απλοποιεί την εύρεση ασυνεπειών.

Μια σημαντική δυνατότητα του GsonBuilder είναι η διαχείριση εκδόσεων πεδίων μέσω των σχολιασμών @Since και @Until. Ο προγραμματιστής καθορίζει την έκδοση αντικειμένου μέσω setVersion, και το Gson αυτόματα συμπεριλαμβάνει ή εξαιρεί πεδία ανάλογα με τον σχολιασμό έκδοσής τους. Αυτό είναι χρήσιμο κατά την εξέλιξη API, όταν το ίδιο μοντέλο χρησιμοποιείται για διαφορετικές εκδόσεις του πρωτοκόλλου διακομιστή. Το GsonBuilder υποστηρίζει επίσης εγγραφή TypeAdapterFactory για καθολική επεξεργασία οικογενειών τύπων και complexMapKeySerialization για σωστή εργασία με σύνθετα κλειδιά Map.

Συχνές ερωτήσεις

Τι είναι το Gson στην ανάπτυξη Android;

Gson — είναι μια βιβλιοθήκη της Google για μετατροπή αντικειμένων Java σε JSON και αντίστροφα. Χρησιμοποιείται ευρέως σε εφαρμογές Android για ανάλυση απαντήσεων διακομιστή, σειριοποίηση αιτημάτων και αποθήκευση δεδομένων σε τοπικό χώρο αποθήκευσης.

Πώς χειρίζεται το Gson τις null τιμές;

Από προεπιλογή, το Gson παραλείπει πεδία με null κατά τη σειριοποίηση. Για ενεργοποίηση null τιμών, χρησιμοποιήστε GsonBuilder.serializeNulls(). Κατά την αποσειριοποίηση, τα πεδία που λείπουν από το JSON παραμένουν null ή λαμβάνουν την προεπιλεγμένη τιμή για τον τύπο.

Σε τι διαφέρει το Gson από το Moshi;

Moshi δεν χρησιμοποιει ανάκλαση για κλάσεις Kotlin, που προσφέρει υψηλότερη απόδοση και προβλέψιμη συμπεριφορά. Το Moshi επίσης χειρίζεται σωστά την ασφάλεια null της Kotlin, ενώ το Gson μπορεί να αποσειριοποιήσει null σε non-null πεδίο, προκαλώντας εξαίρεση.

Πώς λειτουργεί το @SerializedName στο Gson;

@SerializedName συνδέει ένα κλειδί JSON με ένα πεδίο κλάσης όταν τα ονόματά τους δεν ταιριάζουν. Για παράδειγμα, για το πεδίο kotlinName και το κλειδί JSON “kotlin_name”, ο σχολιασμός @SerializedName(“kotlin_name”) εξασφαλίζει σωστή μετατροπή.

Τι είναι το TypeToken στο Gson;

TypeToken — είναι μια αφηρημένη κλάση που συλλαμβάνει την παράμετρο τύπου μέσω μιας ανώνυμης κλάσης. Είναι απαραίτητο για αποσειριοποίηση συλλογών και άλλων παραμετροποιημένων τύπων, επειδή λόγω διαγραφής τύπων, το Gson δεν μπορεί να ανακτήσει τον τύπο στοιχείου κατά το χρόνο εκτέλεσης.

Σύνοψη

  • Gson — βιβλιοθήκη της Google για σειριοποίηση JSON με υποστήριξη Java και Kotlin
  • toJson και fromJson — οι κύριες μέθοδοι για σειριοποίηση και αποσειριοποίηση αντικειμένων
  • @SerializedName — σχολιασμός για αντιστοίχιση πεδίων με κλειδιά JSON σε περίπτωση αναντιστοιχίας ονομάτων
  • @Expose — διαχείριση ορατότητας πεδίων κατά τη σειριοποίηση μέσω GsonBuilder
  • TypeToken — λύση στο πρόβλημα διαγραφής τύπων για παραμετροποιημένες συλλογές
  • GsonBuilder — ρύθμιση μορφοποίησης, εκδόσεων, ημερομηνιών και προσαρμοσμένων προσαρμογέων
  • JsonSerializer/JsonDeserializer — διεπαφές για επεξεργασία τύπων με μη τυπική λογική

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης