Преобразование 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.
Как пользоваться
- Вставьте JSON-объект; для необязательных полей добавьте несколько элементов массива с разными ключами.
- Проверьте результат: корневой класс называется RootInterface, а вложенные классы получают имена по ключам в PascalCase (speakers становится Speakers).
- Скопируйте классы, переименуйте их и уточните все 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, если они могут расти.