Освой Android играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Библиотека Moshi

Библиотека Moshi является современной альтернативой популярной, но устаревшей библиотеке GSON. Также служить для конвертации объектов JSON в Java-объекты и наоборот.

Преимущества перед GSON:

  • Gson добавляет в приложение около 300 кб, Moshi около 120 кб
  • Gson использует рефлексию для сериализации/десериализации JSON-строк. Moshi поддерживает генерацию через Kotlin
  • Gson не поддерживает значения по умолчанию для полей. Если поле отсутствует в ответе на запрос, то могут быть проблемы!

Репозиторий: Гитхаб

Установим зависимость в Gradle.


apply plugin: 'kotlin-kapt'

dependencies {
	// ... другие зависимости
    implementation("com.squareup.moshi:moshi:1.11.0")
    kapt("com.squareup.moshi:moshi-kotlin-codegen:1.11.0")
}

Все примеры смотрите в документации. Мы рассмотрим только один частный случай.

Конвертируем JSON в объект

Допустим с сервера пришёл ответ в виде JSON-строки и мы должны из неё построить объект для работы в своём приложении.

У нас должен быть подготовлен нужный класс. Обратите внимание на аннотации.


package ru.alexanderklimov.moshi

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass

@JsonClass(generateAdapter = true)
data class Cat(
    @Json(name = "name")
    val name: String,
    @Json(name = "age")
    val age: Int,
    @Json(name = "color")
    val color: Int
)

Обрабатываем пришедшую строку и создаём объект.


val jsonText = "{\"name\":\"Мурзик\",\"color\":-16777216,\"age\":9}"

val moshi = Moshi.Builder().build()
val jsonAdapter: JsonAdapter<Cat> = moshi.adapter(
    Cat::class.java
)
val murzik = jsonAdapter.fromJson(jsonText)
println(murzik)
println("Имя кота: ${murzik?.name}")

// I/System.out: Cat(name=Мурзик, age=9, color=-16777216)
// I/System.out: Имя кота: Мурзик

Дополнительное чтение

Реклама