Kodowanie do JSON
Zserializuje Pan/Pani dane do formatu JSON.
Kodowanie do JSON to bezpłatna lekcja Scala for Backend Engineering & Functional Programming na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Scala for Backend Engineering & Functional Programming, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.
Kodery tworzą JSON
Element Encoder[A] jest odpowiednikiem dekodera: zamienia wartość Scali typu A na drzewo Json biblioteki Circe.
Następnie serializujesz je do String na potrzeby odpowiedzi HTTP, logów lub przechowywania.
Składnia asJson
Zaimportuj io.circe.syntax._, aby uzyskać metodę rozszerzającą .asJson dla każdej wartości, dla której w zasięgu znajduje się Encoder.
Typy proste i kolekcje działają od razu.
import io.circe.syntax._
println(42.asJson.noSpaces) // 42
println("hi".asJson.noSpaces) // "hi"
println(List(1,2,3).asJson.noSpaces) // [1,2,3]Wyprowadzanie koderów
Podobnie jak dekodery, kodery dla klas przypadków są wyprowadzane. Zaimportuj io.circe.generic.auto._, aby użyć automatycznego wyprowadzania.
Nazwy pól stają się kluczami JSON, a wartości pól są kodowane rekurencyjnie.
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}Półautomatyczne kodery
W przypadku jawnych, wielokrotnego użytku instancji użyj deriveEncoder z io.circe.generic.semiauto.
Umieszczenie go w obiekcie towarzyszącym zapewnia jedną współdzieloną instancję Encoder[User] w całej bazie kodu.
import io.circe.Encoder
import io.circe.generic.semiauto._
object User {
implicit val enc: Encoder[User] = deriveEncoder[User]
}Ręczne tworzenie Json
Możesz bezpośrednio konstruować JSON za pomocą Json.obj i par klucz/wartość, w których wartości korzystają z .asJson.
Jest to przydatne w przypadku doraźnych struktur, które nie odpowiadają klasie przypadku.
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}Opcje kodowania
Pole typu Option[A] domyślnie koduje Some(x) jako wartość, a None jako JSON null.
Jeśli wolisz całkowicie pomijać klucze null, możesz usunąć je po kodowaniu — pokażemy to później.
case class Account(id: Long, nick: Option[String])
println(Account(7, None).asJson.noSpaces)
// {"id":7,"nick":null}Usuwanie wartości null
Aby pominąć wartości null, przekształć wynikowy element Json za pomocą .deepDropNullValues.
Ta metoda rekurencyjnie usuwa klucze, których wartością jest null, tworząc czytelniejszy wynik dla pól opcjonalnych.
val clean = Account(7, None).asJson.deepDropNullValues
println(clean.noSpaces)
// {"id":7}Czytelne formatowanie wyniku
Użyj .spaces2 lub .spaces4, aby uzyskać sformatowany i czytelny dla człowieka kod JSON, a .noSpaces — aby uzyskać kompaktowy format przewodowy.
Aby uzyskać pełną kontrolę nad formatowaniem, utwórz własny obiekt Printer.
import io.circe.Printer
val printer = Printer.spaces2.copy(dropNullValues = true)
println(printer.print(Account(7, None).asJson))Kodowanie map
Wartość Map[String, A] jest kodowana jako obiekt JSON, a klucze mapy stają się kluczami JSON.
W przypadku kluczy typów innych niż tekstowe należy udostępnić obiekt KeyEncoder, który renderuje klucz jako tekst.
import io.circe.syntax._
val scores = Map("ada" -> 90, "alan" -> 85)
println(scores.asJson.noSpaces)
// {"ada":90,"alan":85}Mapowanie enkoderów
Istniejący enkoder można dostosować za pomocą contramap: należy przekazać funkcję konwertującą dany typ na typ, który Circe już koduje.
Dzięki temu nie trzeba pisać całego enkodera od podstaw.
import io.circe.Encoder
case class UserId(value: Long)
implicit val enc: Encoder[UserId] =
Encoder[Long].contramap(_.value)Kodowanie i dekodowanie razem
Gdy potrzebne są oba kierunki, należy wyprowadzić pojedynczy obiekt Codec[A] za pomocą deriveCodec, który łączy enkoder i dekoder.
Dzięki temu oba elementy pozostają zsynchronizowane, gdy klasa przypadku ewoluuje.
import io.circe.Codec
import io.circe.generic.semiauto._
implicit val codec: Codec[User] = deriveCodec[User]Szybki test
Sprawdź swoją wiedzę na temat kodowania do JSON.
Podsumowanie
Obiekt Encoder[A] przekształca wartości Scali w Json. Używaj .asJson z wyprowadzonymi enkoderami albo twórz drzewa za pomocą Json.obj.
None staje się wartością null, chyba że je usuniesz; contramap pozwala ponownie używać enkoderów, a deriveCodec łączy oba kierunki.
Często zadawane pytania
Czy lekcja „Kodowanie do JSON” jest bezpłatna?
Tak — pełny tekst „Kodowanie do JSON” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Scala for Backend Engineering & Functional Programming, przejdź na CoddyKit PRO. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.
Co nauczysz się w „Kodowanie do JSON”?
Zserializuje Pan/Pani dane do formatu JSON. Ćwiczysz Scala for Backend Engineering & Functional Programming z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Scala for Backend Engineering & Functional Programming?
Nie wymagamy żadnego doświadczenia. Scala for Backend Engineering & Functional Programming w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.
Ile czasu zajmuje lekcja „Kodowanie do JSON”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Scala for Backend Engineering & Functional Programming?
Tak. Każda lekcja Scala for Backend Engineering & Functional Programming zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Parsowanie JSON
- Dekodowanie do case class
- Kodowanie do JSON
- Własne kodeki