Перейти к содержимому

Конвертировать JSON в классы данных Kotlin — Numio

Генерирует data class Kotlin из примера JSON. Целые числа становятся Long, дробные — Double, вложенные объекты получают собственный класс, а ключи, отсутствующие в некоторых элементах массива, становятся nullable-типами, например Boolean?.

Описать REST-ответ для Android-приложения, которое разбирает JSON через Jackson.

JSON

Kotlin

Когда пригодится

  • Описать REST-ответ для Android-приложения, которое разбирает JSON через Jackson.
  • Создать DTO для сервиса на Ktor или Spring Boot по примеру payload.

Как пользоваться

  1. Вставьте репрезентативный JSON-объект или массив в редактор JSON; добавьте элементы массива, в которых видны необязательные ключи.
  2. Изучите панель Kotlin: класс верхнего уровня называется Root, а вложенные классы получают имена по своим ключам (projects становится Project).
  3. Скопируйте классы, переименуйте 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>, если на самом деле это список.

Спецификации и справка