Конвертировать JSON в классы данных Kotlin — Numio
Генерирует data class Kotlin из примера JSON. Целые числа становятся Long, дробные — Double, вложенные объекты получают собственный класс, а ключи, отсутствующие в некоторых элементах массива, становятся nullable-типами, например Boolean?.
Описать REST-ответ для Android-приложения, которое разбирает JSON через Jackson.
Когда пригодится
- Описать REST-ответ для Android-приложения, которое разбирает JSON через Jackson.
- Создать DTO для сервиса на Ktor или Spring Boot по примеру payload.
Как пользоваться
- Вставьте репрезентативный JSON-объект или массив в редактор JSON; добавьте элементы массива, в которых видны необязательные ключи.
- Изучите панель Kotlin: класс верхнего уровня называется Root, а вложенные классы получают имена по своим ключам (projects становится Project).
- Скопируйте классы, переименуйте Root и замените Any? или Long там, где контракт вашего API требует иного.
Ввод JSON
{
"id": 1024,
"full_name": "Ada Lovelace",
"email": null,
"roles": ["admin", "editor"],
"projects": [
{ "name": "Engine", "stars": 42 },
{ "name": "Notes", "stars": 7, "archived": true }
]
}Data class Kotlin
import com.fasterxml.jackson.annotation.JsonProperty
data class Root(
val id: Long,
@JsonProperty("full_name")
val fullName: String,
val email: Any?,
val roles: List<String>,
val projects: List<Project>,
)
data class Project(
val name: String,
val stars: Long,
val archived: Boolean?,
)Подробности и ограничения
Преобразование выполняется в браузере WebAssembly-модулем json_typegen; JSON никуда не загружается. Настроек на этой странице нет.
Ключи не в camelCase получают аннотацию Jackson @JsonProperty и импорт com.fasterxml.jackson.annotation.JsonProperty. Аннотации kotlinx.serialization или Moshi не генерируются.
Значения null и пустые массивы не несут информации о типе, поэтому становятся Any? и List<Any?>.
У nullable-полей нет значения по умолчанию (= null). Добавьте его сами, если поле может отсутствовать при десериализации.
FAQ
Почему целое число получает тип Long, а не Int?
Генератор всегда использует Long для целых чисел, чтобы большие ID не переполнялись. Числа, не помещающиеся в 64-битное целое или записанные с десятичной точкой, становятся Double.
Можно ли преобразовать JSON-массив на корневом уровне?
Да. Корневой массив даёт typealias, например typealias Root = List<Root2>;, и data class Root2 для типа элемента. Переименуйте оба под свой код.
Почему короткий смешанный массив стал Pair<Long, String>?
json_typegen считает короткий массив с элементами разных типов кортежем, поэтому [1, "a"] становится Pair<Long, String>. Замените на List<Any>, если на самом деле это список.