0Pricing
Scala for Backend Engineering & Functional Programming · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. JSONを解析する
  2. ケースクラスにデコードする
  3. JSONにエンコードする
  4. カスタムCodec
← Scala for Backend Engineering & Functional Programmingに戻る