JSONにエンコードする
データをシリアライズして出力します。
「JSONにエンコードする」はCoddyKit上の無料Scala for Backend Engineering & Functional Programmingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはScala for Backend Engineering & Functional Programming学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
EncoderでJSONを生成する
Encoder[A]はDecoderの対になるもので、型AのScala値をCirceのJsonツリーに変換します。
そこから、HTTPレスポンス、ログ、保存用のStringへシリアライズできます。
asJson構文
io.circe.syntax._をインポートすると、スコープ内にEncoderがある任意の値で.asJson拡張メソッドを使えるようになります。
プリミティブ型やコレクションはすぐに利用できます。
import io.circe.syntax._
println(42.asJson.noSpaces) // 42
println("hi".asJson.noSpaces) // "hi"
println(List(1,2,3).asJson.noSpaces) // [1,2,3]Encoderを導出する
Decoderと同様に、case class用のEncoderも導出できます。自動導出には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}半自動Encoder
明示的に再利用できるインスタンスには、io.circe.generic.semiautoのderiveEncoderを使用します。
コンパニオンオブジェクトに配置すると、コードベース全体で共有する1つのEncoder[User]を利用できます。
import io.circe.Encoder
import io.circe.generic.semiauto._
object User {
implicit val enc: Encoder[User] = deriveEncoder[User]
}Jsonを手動で構築する
Json.objとキーと値のペアを使ってJSONを直接構築できます。値には.asJsonを使用します。
case classに対応付けない一時的な形状を作る場合に便利です。
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
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}出力を整形する
人が読みやすいインデント付きの JSON には .spaces2 または .spaces4 を使用し、コンパクトなワイヤ形式には .noSpaces を使用します。
書式を完全に制御するには、カスタム Printer を構築します。
import io.circe.Printer
val printer = Printer.spaces2.copy(dropNullValues = true)
println(printer.print(Account(7, None).asJson))Map のエンコード
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 で導出します。
これにより、case class の変更時にも両者の整合性を保てます。
import io.circe.Codec
import io.circe.generic.semiauto._
implicit val codec: Codec[User] = deriveCodec[User]理解度チェック
JSON へのエンコードについての理解度を確認します。
まとめ
Encoder[A] は Scala の値を Json に変換します。導出したエンコーダーでは .asJson を使用し、Json.obj では JSON ツリーを構築します。
None は除外しない限り null になります。contramap はエンコーダーを再利用し、deriveCodec は両方向をまとめます。
よくある質問
「JSONにエンコードする」レッスンは無料ですか?
はい。「JSONにエンコードする」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Scala for Backend Engineering & Functional Programmingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Scala for Backend Engineering & Functional Programmingコースには全4レッスンが含まれています。
「JSONにエンコードする」で何を学びますか?
データをシリアライズして出力します。 ブラウザで直接実行するハンズオンコードでScala for Backend Engineering & Functional Programmingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Scala for Backend Engineering & Functional Programmingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのScala for Backend Engineering & Functional Programmingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「JSONにエンコードする」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このScala for Backend Engineering & Functional Programmingレッスンでコードを書いて実行できますか?
はい。すべてのScala for Backend Engineering & Functional Programmingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- JSONを解析する
- ケースクラスにデコードする
- JSONにエンコードする
- カスタムCodec