Travailler avec JSON en Kotlin : guide complet pour l'analyse et la sérialisation
JSON (JavaScript Object Notation) reste l'un des formats d'échange de données les plus populaires dans le développement web moderne. Lorsque vous travaillez avec Kotlin, que ce soit pour le backend avec Ktor ou une application mobile Android, savoir analyser et sérialiser efficacement le JSON est une compétence essentielle. Dans cet article, nous allons examiner trois approches principales pour travailler avec JSON en Kotlin : l'utilisation des bibliothèques Gson, Moshi et la solution officielle de JetBrains — kotlinx.serialization.
Pourquoi Kotlin nécessite-t-il une approche particulière du JSON ?
Kotlin est un langage typé statiquement avec des fonctionnalités telles que la null-sécurité, les data-classes et les propriétés par défaut. Les bibliothèques de gestion JSON doivent tenir compte de ces caractéristiques pour que le code soit non seulement fonctionnel, mais aussi idiomatique. Une configuration incorrecte peut entraîner des NullPointerException ou un comportement inattendu lors de la désérialisation.
1. Utilisation de Gson pour travailler avec JSON
Gson de Google est l'une des bibliothèques les plus anciennes et les plus répandues. Elle est simple à utiliser, mais présente certaines particularités lorsqu'elle est utilisée avec Kotlin.
Ajout de la dépendance
// build.gradle.ktsimplementation("com.google.code.gson:gson:2.10.1")Sérialisation d'un objet en JSON
import com.google.gson.Gson
data class User( val id: Int, val name: String, val email: String? = null)
fun main() { val user = User(1, "Иван Петров", "ivan@example.com") val gson = Gson() val json = gson.toJson(user) println(json) // Sortie : {"id":1,"name":"Иван Петров","email":"ivan@example.com"}}Analyse JSON en objet
fun parseUser(jsonString: String): User { val gson = Gson() return gson.fromJson(jsonString, User::class.java)}
fun main() { val json = """{"id":2,"name":"Анна Смирнова","email":null}""" val user = parseUser(json) println(user.name) // Анна Смирнова}Important : Gson utilise la réflexion Java et peut ne pas tenir compte de la null-sécurité de Kotlin. Lors de la désérialisation, les champs déclarés comme non null peuvent recevoir une valeur null, ce qui entraînera une erreur à l'exécution. Il est recommandé d'utiliser @JvmOverloads et des constructeurs avec des valeurs par défaut.
2. Moshi — une alternative moderne de Square
Moshi a été créé en tenant compte des spécificités de Kotlin et offre une meilleure intégration avec la null-sécurité et les data-classes.
Ajout de la dépendance
// build.gradle.ktsimplementation("com.squareup.moshi:moshi-kotlin:1.15.0")kapt("com.squareup.moshi:moshi-kotlin-codegen:1.15.0")Exemple d'utilisation de Moshi
import com.squareup.moshi.Moshiimport com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
data class Product( val id: Int, val title: String, val price: Double, val inStock: Boolean = false)
fun main() { val moshi = Moshi.Builder() .addLast(KotlinJsonAdapterFactory()) .build()
val adapter = moshi.adapter(Product::class.java)
// Sérialisation val product = Product(101, "Ноутбук", 89999.99, true) val json = adapter.toJson(product) println(json) // {"id":101,"title":"Ноутбук","price":89999.99,"inStock":true}
// Désérialisation val jsonString = """{"id":102,"title":"Мышь","price":2500.00}""" val parsedProduct = adapter.fromJson(jsonString) println(parsedProduct?.title) // Мышь println(parsedProduct?.inStock) // false (valeur par défaut)}Moshi gère automatiquement les valeurs par défaut dans les data-classes et fonctionne correctement avec les types nullable. Pour de meilleures performances, il est recommandé d'utiliser la génération de code via l'annotation @JsonClass.