Moshi: Schlüsselkonzepte, JSON-Bibliothek für Kotlin und Funktionsweise

Autor: IT Sectr Veröffentlicht: 2026-03-15 Lesezeit: 8 Min.

Moshi ist eine moderne JSON-Bibliothek von Square, die speziell für Kotlin und Android unter Berücksichtigung der Einschränkungen von Gson entwickelt wurde. Sie ist vollständig mit der Nullsicherheit von Kotlin kompatibel, generiert Code zur Kompilierzeit und verwendet keine Reflektion, was die Leistung und Zuverlässigkeit verbessert. Laut Square Moshi, 2024, bietet Moshi eine vorhersagbare Serialisierung und unterstützt benutzerdefinierte Adapter für beliebige Datentypen.

Wichtige Punkte

  • Moshi — JSON-Bibliothek von Square für Kotlin und Android ohne Reflektion
  • Kotlin-Adapter — integrierte Unterstützung für Data Class, Standardwerte und Nullsicherheit
  • @Json — Annotation zur Konfiguration des Feldnamens und Ignorieren von Eigenschaften
  • Adapter — benutzerdefinierte Serialisierungslogik per @ToJson und @FromJson
  • Codegenerierung — Moshi generiert Adapter zur Kompilierzeit über kapt oder KSP

Was ist Moshi

Moshi ist eine JSON-Bibliothek für JVM, Android und Kotlin Multiplatform, entwickelt von Square (den Autoren von OkHttp und Retrofit). Im Gegensatz zu Gson verlässt sich Moshi nicht auf Reflektion — die Adapter werden zur Kompilierzeit über die Annotation @JsonClass(generateAdapter = true) generiert. Das macht Moshi schneller, sicherer und vorhersagbarer bei der Arbeit mit Kotlin-spezifischen Konstrukten.

Philosophie und Vorteile

Der Hauptunterschied zwischen Moshi und seinen Vorgängern ist die Ablehnung von Reflektion. Reflektion ermöglicht es Gson, ohne Vorbereitung mit jeder Klasse zu arbeiten, aber der Preis ist eine langsame Initialisierung, die Unmöglichkeit der Optimierung durch den Compiler und das Risiko von Laufzeitfehlern. Moshi erfordert eine explizite Klassendeklaration für die Codegenerierung, bietet dafür aber die Geschwindigkeit von handgeschriebenem Code und vollständige Typsicherheit zur Kompilierzeit.

kotlin
// Moshi zu build.gradle hinzufügen
dependencies {
    implementation "com.squareup.moshi:moshi:1.15.0"
    implementation "com.squareup.moshi:moshi-kotlin:1.15.0"
    kapt "com.squareup.moshi:moshi-kotlin-codegen:1.15.0"
}

// Einfaches Modell mit Codegenerierung
@JsonClass(generateAdapter = true)
data class User(
    @Json(name = "user_id")
    val id: Int,
    val name: String,
    val email: String,
    val avatar: String? = null
)

// Verwendung
val moshi = Moshi.Builder()
    .build()
val jsonAdapter = moshi.adapter(User::class.java)

Installation und Konfiguration

Um mit Moshi zu arbeiten, müssen Abhängigkeiten zur build.gradle hinzugefügt und die Modelle annotiert werden. Moshi.Builder dient als Einstiegspunkt: über ihn werden integrierte Adapter für Standardtypen, benutzerdefinierte Adapter hinzugefügt und das Verhalten der Bibliothek konfiguriert. Moshi unterstützt Adapter für Date, Enum, Collection und Map standardmäßig, aber Kotlin-Klassen benötigen das Modul moshi-kotlin. Im Gegensatz zu Gson verwendet Moshi standardmäßig keine Reflektion für Kotlin-Klassen — dafür wird KotlinJsonAdapterFactory eingebunden, der als Fallback dient, wenn keine Codegenerierung verwendet wird oder die Klasse nicht mit @JsonClass annotiert ist. Dieser Ansatz stellt sicher, dass der Entwickler für jede spezifische Klasse explizit zwischen der Leistung der Codegenerierung und der Flexibilität der Reflektion wählt.

Moshi erstellen und Adapter hinzufügen

Nachdem Moshi über den Builder erstellt wurde, erhält der Entwickler eine Moshi-Instanz und fordert einen Adapter für die gewünschte Klasse an. JsonAdapter ist das zentrale Objekt, das die Serialisierung über toJson() und die Deserialisierung über fromJson() durchführt. Moshi verwendet automatisch den generierten Adapter, wenn die Klasse mit @JsonClass(generateAdapter = true) annotiert ist, andernfalls wird der reflektierende KotlinJsonAdapterFactory als Fallback angewendet. Dieser Ansatz kombiniert die Geschwindigkeit der Codegenerierung mit der Flexibilität eines reflektierenden Mechanismus für Projekte jeder Größenordnung und Komplexität. Moshi eignet sich sowohl für kleine Anwendungen als auch für große Unternehmensprojekte mit Hunderten von Datenmodellen.

kotlin
// Moshi mit KotlinJsonAdapterFactory konfigurieren
val moshi = Moshi.Builder()
    .add(KotlinJsonAdapterFactory())
    .add(LocalDateAdapter())
    .build()

// Adapter verwenden
val adapter = moshi.adapter(User::class.java)

// Serialisierung
val user = User(1, "Alice", "alice@test.com")
val json = adapter.toJson(user)

// Deserialisierung
val jsonString = """{"user_id":2,"name":"Bob","email":"bob@test.com"}"""
val parsedUser = adapter.fromJson(jsonString)

// Mit Listen arbeiten
val listAdapter = moshi.adapter(
    Types.newParameterizedType(
        List::class.java,
        User::class.java
    )
)

Annotationen und Adapter

Moshi verwendet Annotationen zur Konfiguration der Serialisierung und zur Unterstützung benutzerdefinierter Typen. @Json(name = "...") legt den JSON-Schlüssel für ein Feld fest. @Transient schließt ein Feld von der Serialisierung aus. @JsonClass(generateAdapter = true) aktiviert die Codegenerierung. Für benutzerdefinierte Logik stellt Moshi die Annotationen @ToJson und @FromJson bereit, die in einer separaten Adapterklasse platziert werden können.

@Json und benutzerdefinierte Adapter

Die @Json-Annotation ersetzt Gsons @SerializedName und funktioniert ähnlich: das Feld kotlinName wird mit dem JSON-Schlüssel „kotlin_name“ verknüpft. Für Typen, die Moshi standardmäßig nicht serialisieren kann (z.B. LocalDate), erstellt der Entwickler eine Klasse mit @ToJson- und @FromJson-Methoden. Adapter werden über Moshi.Builder.add() registriert und global oder für einen bestimmten Typ angewendet. Moshi unterstützt versiegelte Klassen und polymorphe Serialisierung über @JsonClass mit einem expliziten Diskriminator, was die Arbeit mit Typhierarchien in JSON ohne manuelle Feldüberprüfung ermöglicht. Bei der Deserialisierung ignoriert Moshi standardmäßig unbekannte JSON-Schlüssel, was die Abwärtskompatibilität beim Hinzufügen neuer Felder auf der Serverseite ohne Änderung des Client-Codes gewährleistet. Zum Debuggen kann der strenge Modus über failOnUnknown aktiviert werden, der eine Ausnahme auslöst, wenn unbekannte Schlüssel gefunden werden.

kotlin
// Benutzerdefinierter Adapter für LocalDate
class LocalDateAdapter {

    @ToJson
    fun toJson(date: LocalDate): String {
        return date.format(DateTimeFormatter.ISO_LOCAL_DATE)
    }

    @FromJson
    fun fromJson(dateString: String): LocalDate {
        return LocalDate.parse(dateString)
    }
}

// Modell mit Moshi-Annotationen
@JsonClass(generateAdapter = true)
data class Event(
    @Json(name = "event_id")
    val id: Int,

    @Json(name = "event_date")
    val date: LocalDate,

    @Transient
    val localCache: String? = null
)

// Adapter registrieren
val moshi = Moshi.Builder()
    .add(LocalDateAdapter())
    .add(KotlinJsonAdapterFactory())
    .build()

Moshi vs Gson

Der Vergleich von Moshi und Gson ist eine häufige Frage bei der Wahl einer JSON-Bibliothek für ein Android-Projekt. Moshi punktet in der modernen Kotlin-Entwicklung dank Codegenerierung, Nullsicherheit und Geschwindigkeit. Gson bleibt für Java-Projekte, Legacy-Code und Szenarien relevant, in denen eine minimale Konfiguration wichtig ist. Der Unterschied wird bei großen Datenmengen und komplexen Modellen deutlich.

Leistung und Sicherheit

Leistungstests zeigen, dass Moshi mit Codegenerierung bei Serialisierungs- und Deserialisierungsvorgängen 2–5 Mal schneller ist als Gson. Der Hauptvorteil von Moshi ist die korrekte Handhabung der Nullsicherheit von Kotlin: Fehlt ein Feld im JSON und das Modell deklariert es als non-null ohne Standardwert, löst Moshi eine Ausnahme bei der Deserialisierung aus und verhindert so versteckte Fehler.

EigenschaftGsonMoshi
MechanismusReflektionCodegenerierung / Reflektion
Nullsicherheitnicht berücksichtigtvolle Kotlin-Unterstützung
Geschwindigkeitmittelhoch
Standardwertenicht unterstütztunterstützt
Kotlin Multiplatformneinja
Bibliotheksgröße~240 Kb~150 Kb

Die Wahl zwischen Moshi und Gson hängt vom Projektkontext ab. Neue Kotlin-Projekte profitieren von Moshi dank Typsicherheit und Leistung. Gson bleibt eine vernünftige Wahl zur Unterstützung von Java-Code, dynamischen JSON-Strukturen oder wenn die Einfachheit der Einrichtung wichtiger ist als die Geschwindigkeit. Für Kotlin Multiplatform ist Moshi die einzige der beiden Optionen, die diese Plattform unterstützt.

Bei der Migration von Gson zu Moshi betreffen die Hauptänderungen Annotationen und Adapter. Gsons @SerializedName wird durch @Json(name = "...") ersetzt und benutzerdefinierte JsonSerializer/JsonDeserializer durch das Paar @ToJson/@FromJson. Bei Modellen mit Standardwerten und nullable-Feldern verhält sich Moshi vorhersagbarer: Fehlt ein non-null-Feld ohne Standardwert im JSON, löst Moshi eine JsonDataException aus und verhindert versteckte NPEs. Die Integration mit Retrofit über MoshiConverterFactory wird mit einer einzigen Abhängigkeit hinzugefügt und erfordert keine Änderung der Netzwerkschichtarchitektur. Für die Verschleierung durch ProGuard oder R8 müssen Regeln hinzugefügt werden, um mit @JsonClass annotierte Klassen und generierte Adapter zu erhalten, andernfalls bricht die Serialisierung im Release-Build zusammen. Insgesamt ist die Migration von Gson zu Moshi in neuen Kotlin-Projekten gerechtfertigt, in denen Leistung und Typsicherheit wichtig sind.

kotlin
// Serialisierungsvergleich: Gson vs Moshi
data class Sample(
    val name: String,
    val count: Int,
    val tags: List<String> = listOf()
)

// Gson: arbeitet über Reflektion
val gson = Gson()
val fromGson = gson.fromJson("""{"name":"test"}""",
    Sample::class.java)
// count = 0 (Standard), aber Nullsicherheit wird nicht geprüft

// Moshi: benötigt einen Adapter, Nullsicherheit ist explizit
@JsonClass(generateAdapter = true)
data class SampleMoshi(
    val name: String,
    val count: Int,
    val tags: List<String> = listOf()
)

Häufig gestellte Fragen

Was ist Moshi in Android?

Moshi ist eine JSON-Bibliothek von Square für Kotlin und Android, die Codegenerierung anstelle von Reflektion verwendet. Sie bietet hohe Leistung, korrekte Handhabung der Kotlin-Nullsicherheit und Kompatibilität mit Kotlin Multiplatform.

Wie ist Moshi besser als Gson?

Moshi übertrifft Gson in Geschwindigkeit (2–5 Mal schneller dank Codegenerierung), Sicherheit (berücksichtigt Kotlin-Null-Annotationen) und Größe (~90 Kb kleiner). Moshi unterstützt auch Kotlin Multiplatform und Standardwerte in Data Classes.

Wie funktioniert die @JsonClass-Annotation in Moshi?

@JsonClass(generateAdapter = true) weist Moshi an, einen Adapter für die angegebene Klasse zur Kompilierzeit zu generieren. Der generierte Adapter führt die Serialisierung direkt ohne Reflektion durch und bietet so maximale Leistung.

Wie erstellt man einen benutzerdefinierten Moshi-Adapter?

Erstellen Sie eine Klasse mit Methoden, die mit @ToJson (Serialisierung) und @FromJson (Deserialisierung) annotiert sind. Registrieren Sie die Instanz über Moshi.Builder.add(). Moshi findet und wendet den Adapter automatisch an, wenn mit dem entsprechenden Typ gearbeitet wird.

Unterstützt Moshi Kotlin Multiplatform?

Ja, Moshi unterstützt Kotlin Multiplatform ab Version 1.13.0. Damit ist es die einzige populäre JSON-Lösung für KMP-Projekte, die die Verwendung gemeinsamen Serialisierungscodes auf allen Zielplattformen ermöglicht.

Zusammenfassung

  • Moshi — moderne JSON-Bibliothek von Square mit Codegenerierung statt Reflektion
  • @JsonClass — Annotation zur Adaptergenerierung mit Geschwindigkeit von handgeschriebenem Code
  • @Json — Konfiguration von JSON-Schlüsseln, @Transient — Ausschluss von Feldern aus der Serialisierung
  • @ToJson und @FromJson — einfache API für benutzerdefinierte Adapter beliebiger Typen
  • Nullsicherheit — Moshi beachtet Kotlin-Annotationen und löst bei Nichtübereinstimmung eine Ausnahme aus
  • Leistung — 2–5 Mal schneller als Gson bei Serialisierungs- und Deserialisierungsvorgängen
  • Kotlin Multiplatform — KMP-Unterstützung für universellen Serialisierungscode

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch