Scala for Backend Engineering & Functional Programming · Урок

Кодирование в JSON

Сериализуйте свои данные.

Урок 3 из 413 шагов

«Кодирование в 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 — локальная установка не требуется.

Все уроки этого курса

  1. Разбор JSON
  2. Декодирование в классы вариантов
  3. Кодирование в JSON
  4. Пользовательские кодеки
← Назад к Scala for Backend Engineering & Functional Programming