Introdução: por que o Kotlin sabe trabalhar com JSON?
\n\nJSON (JavaScript Object Notation) é um formato leve de troca de dados que se tornou padrão para aplicações web modernas e APIs. Se você programa em Kotlin, seja um aplicativo Android ou um backend, mais cedo ou mais tarde precisará fazer parsing de respostas JSON do servidor ou serializar seus objetos para envio.
\n\nKotlin é uma linguagem moderna que roda sobre a JVM e é totalmente compatível com Java. No entanto, o Kotlin possui suas próprias ferramentas poderosas para trabalhar com JSON, que tornam o código mais conciso e seguro. Neste artigo, abordaremos duas abordagens mais populares: o uso da biblioteca oficial kotlinx.serialization e a consagrada Gson.
\n\nO artigo é voltado para iniciantes. Começaremos com o parsing simples de uma string, depois passaremos para a criação de estruturas aninhadas complexas e, no final, abordaremos a serialização — a transformação de seus objetos de volta para JSON.
\n\n1. Preparação do projeto: dependências e imports
\n\nAntes de escrever código, é necessário adicionar as bibliotecas. Veremos duas opções.
\n\n1.1. Instalação do kotlinx.serialization
\n\nEsta é a solução oficial da JetBrains. Adicione ao arquivo build.gradle.kts:
plugins {\n kotlin("jvm") version "1.9.0"\n kotlin("plugin.serialization") version "1.9.0"\n}\n\ndependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")\n}\n\n\n1.2. Instalação do Gson
\n\nGson é uma biblioteca do Google. É mais simples de configurar, mas exige mais trabalho manual:
\n\ndependencies {\n implementation("com.google.code.gson:gson:2.10.1")\n}\n\n\nApós sincronizar o projeto, você pode escrever o código.
\n\n2. Parsing de JSON em Kotlin com kotlinx.serialization
\n\nEsta abordagem é a mais "kotlinística". Você declara data classes e adiciona a anotação @Serializable. A biblioteca gera automaticamente o código para o parsing.
2.1. Exemplo simples: dados do usuário
\n\nSuponha que temos uma string JSON:
\n\n{\n "name": "Анна",\n "age": 25,\n "email": "anna@example.com"\n}\n\n\nCriamos o modelo:
\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\n\n@Serializable\ndata class User(\n val name: String,\n val age: Int,\n val email: String\n)\n\nfun main() {\n val jsonString = """\n {\n "name": "Анна",\n "age": 25,\n "email": "anna@example.com"\n }\n """.trimIndent()\n\n val user = Json.decodeFromString<User>(jsonString)\n println("Nome: ${user.name}, Idade: ${user.age}")\n}\n\n\nComo você pode ver, sem mapeamentos manuais — tudo é automático.
\n\n2.2. Trabalhando com listas e objetos aninhados
\n\nAPIs reais frequentemente retornam arrays. Vamos adicionar o campo address:
@Serializable\ndata class Address(\n val city: String,\n val street: String\n)\n\n@Serializable\ndata class UserWithAddress(\n val name: String,\n val age: Int,\n val address: Address\n)\n\nfun main() {\n val jsonArray = """\n [\n {"name": "Иван", "age": 30, "address": {"city": "Москва", "street": "Тверская"}},\n {"name": "Мария", "age": 22, "address": {"city": "СПб", "street": "Невский"}}\n ]\n """.trimIndent()\n\n val users = Json.decodeFromString<List<UserWithAddress>>(jsonArray)\n users.forEach { println("${it.name} mora em ${it.address.city}") }\n}\n\n\nObserve: para trabalhar com listas, usa-se o generic List<UserWithAddress>.
3. Parsing de JSON com Gson
\n\nGson é uma biblioteca clássica do Java. Ela também funciona muito bem em Kotlin, mas exige um pouco mais de código.
\n\n3.1. Parsing básico
\n\nimport com.google.gson.Gson\n\ndata cl