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

Преобразование JSON в case-классы Scala — Numio

Превращает пример JSON в case class Scala. Вложенные объекты становятся отдельными case class, массивы — Seq[...]; значения null и ключи, отсутствующие в некоторых элементах массива, становятся Option[...].

Набросать модели для JSON API перед добавлением кодека Circe, Play JSON или uPickle.

JSON

Scala Case Class

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

  • Набросать модели для JSON API перед добавлением кодека Circe, Play JSON или uPickle.
  • Превратить пример payload из Kafka или HTTP в case class для задачи Spark или Akka.

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

  1. Вставьте JSON-объект; для необязательных полей добавьте несколько элементов массива с разными ключами.
  2. Проверьте результат: корневой класс называется RootInterface, а вложенные классы получают имена по ключам в PascalCase (speakers становится Speakers).
  3. Скопируйте классы, переименуйте их и уточните все Option[Any] или Seq[Any], которые не удалось типизировать по примеру.

Ввод JSON

{
  "id": 7,
  "type": "conference",
  "price": 49.9,
  "venue": null,
  "tags": ["jvm", "fp"],
  "speakers": [
    { "name": "Martin", "talk": "Keynote" },
    { "name": "Li", "talk": "Effects", "slides": "https://example.com/s.pdf" }
  ]
}

Case class Scala

case class RootInterface(
  id: Int,
  `type`: String,
  price: Double,
  venue: Option[Any],
  tags: Seq[String],
  speakers: Seq[Speakers]
)

case class Speakers(
  name: String,
  talk: String,
  slides: Option[String]
)

Подробности и ограничения

Работает в браузере на собственном генераторе сайта; запросов к серверу нет. Настроек на странице нет, импорты и выводы кодеков не добавляются.

Все элементы массива объединяются: ключ, отсутствующий в некоторых элементах или равный в них null, становится Option[...], а 12 рядом с 1.5 даёт Double.

Значение, которое всегда null, даёт Option[Any], а пустой массив — Seq[Any], поскольку в примере нет типа.

Зарезервированные слова и ключи, не являющиеся идентификаторами, заключаются в обратные кавычки, например `type`; ключи в snake_case сохраняются как есть.

FAQ

Генерирует ли он Option для nullable-полей?

Да. Ключ со значением null становится Option[...] с типом из других примеров, если у ключа есть и реальные значения, иначе Option[Any]. Ключи, отсутствующие в некоторых элементах массива, тоже становятся Option.

Что происходит с JSON-массивом на корневом уровне?

Его элементы объединяются в один case class RootInterface, где ключи, отсутствующие в некоторых элементах, становятся Option, и добавляется type RootInterfaceList = Seq[RootInterface].

Получает ли 64-битный ID тип Long?

Только если значение в примере выходит за диапазон Int (примерно ±2,1 млрд). Остальные целые числа становятся Int, поэтому замените тип ID или временных меток на Long, если они могут расти.

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