Gson — co to je, JSON knihovna pro Java a Kotlin

Autor: IT Sectr Publikováno: 2026-03-15 Doba čtení: 8 min

Gson — knihovna od Google pro serializaci Java objektů do JSON a zpět, široce používaná ve vývoji pro Android. Umožňuje převádět složité grafy objektů na kompaktní JSON řetězce bez ručního psaní parserů. Podle údajů Google Gson, 2024, knihovna má přes 23 tisíc hvězdiček na GitHubu a zůstává jedním z nejoblíbenějších řešení pro práci s JSON v ekosystému Java a Kotlin.

Hlavní body

  • Gson — knihovna Google pro JSON serializaci v Java a Kotlin
  • fromJson — deserializace JSON do Java objektu libovolného typu
  • toJson — serializace objektu do JSON řetězce
  • @SerializedName — anotace pro propojení JSON klíče s polem třídy
  • TypeToken — práce s generikami a parametrizovanými typy

Co je Gson

Gson — je Java knihovna vyvinutá Googlem pro převod objektů do JSON reprezentace a zpět. Používá reflexi k analýze struktury tříd, což umožňuje práci bez předchozí konfigurace. Gson podporuje libovolné Java objekty, kolekce, pole, generiky a vnořené třídy. Knihovna nevyžaduje anotace pro základní použití, ale poskytuje je pro jemné doladění. Hlavní nevýhodou reflexe je snížení výkonu při inicializaci a nemožnost optimalizace ve fázi kompilace, což je zvláště patrné při studeném startu Android aplikace při deserializaci stovek modelů. Navzdory tomu Gson zůstává spolehlivou volbou pro většinu projektů díky stabilitě a rozsáhlé dokumentaci.

Historie a místo v ekosystému

Gson byl vydán Googlem v roce 2008 a rychle se stal de facto standardem pro JSON v Android aplikacích. Před příchodem Moshi a kotlinx.serialization zůstával Gson jedinou populární volbou pro Kotlin projekty. Jednoduchost připojení — přidání jedné závislosti v build.gradle — a absence povinných anotací učinily Gson populárním mezi vývojáři všech úrovní.

groovy
// Přidání Gson do build.gradle
dependencies {
    implementation 'com.google.code.gson:gson:2.10.1'
}

// Základní použití
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"}

Kromě základní serializace poskytuje Gson GsonBuilder pro konfiguraci chování: formátování dat, vypnutí HTML escapování, registr klíčů a vlastní instance. GsonBuilder také umožňuje registrovat vlastní JsonSerializer a JsonDeserializer pro typy, které knihovna nemůže zpracovat automaticky. Flexibilita konfigurace činí GsonBuilder nepostradatelným a užitečným nástrojem při přizpůsobování knihovny specifickým požadavkům projektu v moderním vývoji pro Android.

Základní operace toJson a fromJson

toJson převádí Java objekt na JSON řetězec, analyzuje jeho pole pomocí reflexe. Ve výchozím nastavení Gson zahrnuje všechna pole kromě transient a static. Metoda podporuje všechny typy: primitivy, objekty, kolekce a pole. fromJson provádí opačný převod, přijímá JSON řetězec a třídu cílového objektu a vrací instanci s vyplněnými poli.

Převod objektu na JSON

Při serializaci Gson rekurzivně prochází všechna pole objektu, včetně vnořených. Cyklické reference vedou k StackOverflowError, proto je nutné je vyloučit pomocí anotace @Expose nebo vlastního adaptéru. Pro kolekce Gson zachovává typ prvků, ale při deserializaci seznamu s generikami je vyžadován TypeToken pro zachování informace o typu.

kotlin
// data class s vnořeným objektem
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"))

// Serializace do JSON
val json = gson.toJson(employee)

// Deserializace z JSON
val jsonString = """
{"id":2,"name":"Bob","address":{"city":"London","street":"Baker St"}}
"""
val parsed = gson.fromJson(jsonString, Employee::class.java)

Anotace a konfigurace

Gson poskytuje sadu anotací pro řízení procesu serializace. @SerializedName určuje název JSON klíče odlišný od názvu pole. @Expose řídí zahrnutí pole do serializace: Gson vytvořený přes GsonBuilder.excludeFieldsWithoutExposeAnnotation() bude zpracovávat pouze pole s @Expose. @Since a @Until řídí verzování polí.

@SerializedName a @Expose

Anotace @SerializedName řeší problém nesouladu názvů: server může používat snake_case, zatímco v kódu je přijat camelCase. Anotace přijímá hodnotu a volitelné alternativy pro zpětnou kompatibilitu. @Expose umožňuje skrýt citlivá pole (hesla, tokeny) před serializací označením jako @Expose(serialize = false). Kromě zahrnutí a vyloučení lze @Expose kombinovat s GsonBuilder.excludeFieldsWithoutExposeAnnotation pro vytvoření bílé listiny polí, což pomáhá řídit útočnou plochu při serializaci objektů s velkým počtem polí.

kotlin
// Model s anotacemi 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 s filtrováním @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

Práce s generikami

Problém generik v Java a Kotlin spočívá v mazání typů během kompilace. Když Gson deserializuje List<User>, nezná typ prvku a vrací List<Map<String, Any>>. Pro zachování informace o typu poskytuje Gson TypeToken — abstraktní třídu, která zachycuje parametr typu prostřednictvím anonymní třídy. Bez TypeToken by vývojář musel ručně převádět každý prvek z Map do cílového typu, což vede k rozsáhlému kódu a ztrátě výkonu.

TypeToken pro seznamy

TypeToken řeší problém mazání typů. Vývojář vytvoří anonymního potomka TypeToken s požadovaným parametrem typu a Gson použije informaci z podpisu třídy pro správnou deserializaci. TypeToken také funguje s Map, Set a jakýmikoli jinými parametrizovanými typy, včetně vnořených generik. Konkrétně pro Map<String, List<User>> je vyžadován TypeToken s úplným podpisem vnořeného typu, jinak Gson deserializuje hodnoty jako List<Map<String, Any>> místo List<User>.

kotlin
// TypeToken pro deserializaci seznamu
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)

// Vlastní deserializátor
class LocalDateAdapter :
    JsonDeserializer<LocalDate> {

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

Pro vlastní logiku serializace Gson podporuje rozhraní JsonSerializer a JsonDeserializer. Registrují se přes GsonBuilder.registerTypeAdapter() a umožňují zpracování typů, které knihovna nemůže automaticky serializovat: data Java 8, Enum s nestandardními hodnotami nebo třídy třetích stran bez přístupu ke zdrojovému kódu. Při implementaci adaptéru je důležité sledovat výkon: volání reflexe uvnitř vlastního adaptéru ruší výhody ručního řízení, proto se preferují přímá volání metod a polí. V ekosystému Gson existuje také modul gson-extras poskytující adaptéry pro běžné typy jako UUID, Optional a datové typy Joda-Time.

Konfigurace pomocí GsonBuilder

GsonBuilder poskytuje desítky metod pro jemné doladění serializace. setPrettyPrinting přidává odsazení a nové řádky do výstupního JSON pro čitelnost. disableHtmlEscaping vypíná escapování HTML znaků v řetězcích. setDateFormat nastavuje formát data, což je kritické při práci se servery používajícími nestandardní reprezentaci času. setLenient zapíná volný režim parsování, který ignoruje některé chyby formátování JSON. addDeserializationExclusionStrategy umožňuje programové vyloučení polí z deserializace na základě vlastních strategií. Pro ladění je metoda setPrettyPrinting užitečná v kombinaci s logováním — dělá JSON odpovědi čitelné v logech a zjednodušuje hledání nesrovnalostí.

Důležitou schopností GsonBuilder je řízení verzování polí pomocí anotací @Since a @Until. Vývojář určuje verzi objektu pomocí setVersion a Gson automaticky zahrnuje nebo vylučuje pole v závislosti na jejich verzi anotace. To je užitečné při evoluci API, kdy je stejný model používán pro různé verze serverového protokolu. GsonBuilder také podporuje registraci TypeAdapterFactory pro globální zpracování rodin typů a complexMapKeySerialization pro správnou práci s komplexními klíči Map.

Často kladené dotazy

Co je Gson ve vývoji pro Android?

Gson — je knihovna Google pro převod Java objektů do JSON a zpět. Je široce používána v Android aplikacích pro parsování odpovědí serveru, serializaci požadavků a ukládání dat do lokálního úložiště.

Jak Gson zpracovává null hodnoty?

Ve výchozím nastavení Gson přeskočí pole s null při serializaci. Pro povolení null hodnot použijte GsonBuilder.serializeNulls(). Při deserializaci pole chybějící v JSON zůstávají null nebo přebírají výchozí hodnotu pro daný typ.

Čím se Gson liší od Moshi?

Moshi nepoužívá reflexi pro Kotlin třídy, což poskytuje vyšší výkon a předvídatelné chování. Moshi také správně zpracovává null-bezpečnost Kotlin, zatímco Gson může deserializovat null do non-null pole, což způsobí výjimku.

Jak funguje @SerializedName v Gson?

@SerializedName propojuje JSON klíč s polem třídy, když se jejich názvy neshodují. Například pro pole kotlinName a JSON klíč „kotlin_name” anotace @SerializedName(„kotlin_name”) zajišťuje správný převod.

Co je TypeToken v Gson?

TypeToken — je abstraktní třída, která zachycuje parametr typu prostřednictvím anonymní třídy. Je nezbytný pro deserializaci kolekcí a dalších parametrizovaných typů, protože kvůli mazání typů Gson nemůže obnovit typ prvku za běhu.

Shrnutí

  • Gson — knihovna Google pro JSON serializaci s podporou Java a Kotlin
  • toJson a fromJson — hlavní metody pro serializaci a deserializaci objektů
  • @SerializedName — anotace pro mapování polí s JSON klíči při nesouladu názvů
  • @Expose — řízení viditelnosti polí při serializaci pomocí GsonBuilder
  • TypeToken — řešení problému mazání typů pro parametrizované kolekce
  • GsonBuilder — konfigurace formátování, verzování, dat a vlastních adaptérů
  • JsonSerializer/JsonDeserializer — rozhraní pro zpracování typů s nestandardní logikou

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také