Кодирование в JSON
Сериализуйте свои данные.
«Кодирование в JSON» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Кодировщики создают JSON
Encoder[A] — парный декодеру компонент: он преобразует значение Scala типа A в дерево Circe Json.
Затем Вы сериализуете его в String для HTTP-ответов, журналов или хранения.
Синтаксис asJson
Импортируйте io.circe.syntax._, чтобы получить метод-расширение .asJson для любого значения, для которого в области видимости есть Encoder.
Примитивы и коллекции работают сразу.
import io.circe.syntax._
println(42.asJson.noSpaces) // 42
println("hi".asJson.noSpaces) // "hi"
println(List(1,2,3).asJson.noSpaces) // [1,2,3]Вывод кодировщиков
Как и декодеры, кодировщики для классов-образцов выводятся автоматически. Импортируйте io.circe.generic.auto._ для автоматического вывода.
Имена полей становятся ключами JSON, а значения полей кодируются рекурсивно.
import io.circe.generic.auto._
import io.circe.syntax._
case class User(name: String, age: Int)
println(User("Ada", 36).asJson.noSpaces)
// {"name":"Ada","age":36}Полуавтоматические кодировщики
Для явных и пригодных к повторному использованию экземпляров используйте deriveEncoder из io.circe.generic.semiauto.
Размещение его в сопутствующем объекте даёт один общий Encoder[User] для всей кодовой базы.
import io.circe.Encoder
import io.circe.generic.semiauto._
object User {
implicit val enc: Encoder[User] = deriveEncoder[User]
}Создание Json вручную
Вы можете создавать JSON напрямую с помощью Json.obj и пар ключ/значение, где значения используют .asJson.
Это удобно для разовых структур, не соответствующих классу-образцу.
import io.circe.Json
import io.circe.syntax._
val j = Json.obj(
"ok" -> true.asJson,
"count" -> 3.asJson
)
println(j.noSpaces) // {"ok":true,"count":3}Параметры кодирования
Поле типа Option[A] по умолчанию кодирует Some(x) как значение, а None — как JSON null.
Если Вы предпочитаете полностью исключать ключи со значением null, их можно удалить после кодирования; это показано далее.
case class Account(id: Long, nick: Option[String])
println(Account(7, None).asJson.noSpaces)
// {"id":7,"nick":null}Удаление значений null
Чтобы исключить значения null, преобразуйте полученный Json с помощью .deepDropNullValues.
Этот метод рекурсивно удаляет ключи со значением null, создавая более чистый результат для необязательных полей.
val clean = Account(7, None).asJson.deepDropNullValues
println(clean.noSpaces)
// {"id":7}Форматированный вывод результата
Используйте .spaces2 или .spaces4 для форматированного JSON с отступами, удобного для чтения, а .noSpaces — для компактного формата передачи.
Для полного контроля над форматированием создайте собственный Printer.
import io.circe.Printer
val printer = Printer.spaces2.copy(dropNullValues = true)
println(printer.print(Account(7, None).asJson))Кодирование отображений
Map[String, A] кодируется в JSON-объект, при этом ключи отображения становятся ключами JSON.
Для типов ключей, отличных от строковых, необходимо предоставить KeyEncoder, который представляет ключ в виде текста.
import io.circe.syntax._
val scores = Map("ada" -> 90, "alan" -> 85)
println(scores.asJson.noSpaces)
// {"ada":90,"alan":85}Отображение над кодировщиками
Существующий кодировщик можно адаптировать с помощью contramap: передайте функцию, преобразующую ваш тип в тип, который Circe уже умеет кодировать.
Так не потребуется писать кодировщик полностью с нуля.
import io.circe.Encoder
case class UserId(value: Long)
implicit val enc: Encoder[UserId] =
Encoder[Long].contramap(_.value)Совместное кодирование и декодирование
Когда нужны оба направления, выведите единый Codec[A] с помощью deriveCodec, который объединяет кодировщик и декодировщик.
Так оба направления остаются согласованными при изменении класса вариантов.
import io.circe.Codec
import io.circe.generic.semiauto._
implicit val codec: Codec[User] = deriveCodec[User]Быстрая проверка
Проверьте, насколько хорошо вы поняли кодирование в JSON.
Итоги
Encoder[A] преобразует значения Scala в Json. Используйте .asJson с выведенными кодировщиками или создавайте деревья с помощью Json.obj.
None превращается в null, если его не удалить; contramap позволяет повторно использовать кодировщики; deriveCodec объединяет оба направления.
Изучай Scala с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 39
- Уроки
- 143
Часто задаваемые вопросы
Урок «Кодирование в JSON» бесплатный?
Да — полный текст урока «Кодирование в JSON» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Чему я научусь в уроке «Кодирование в JSON»?
Сериализуйте свои данные. Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?
Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Кодирование в JSON»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?
Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Разбор JSON
- Декодирование в классы вариантов
- Кодирование в JSON
- Пользовательские кодеки