Scala → JSON コンバーター
Scala の case class やオブジェクトを貼り付けると、きれいな JSON が返ります。
このツールでできること
フィールドが十数個ある Scala の case class に対して、対応する JSON ペイロードが必要になる場面 — テスト、API 呼び出し、Kafka メッセージの fixture など — で、手で組み立てるのはすぐに面倒になります。ここに Scala を貼り付けると、有効な JSON が返ります。単一の case class、複数の case class が入ったファイル、名前付き引数で組み立てたインスタンス — どれも同じフローで同じ結果になります。
このコンバーターは、よくある Scala の JSON ライブラリが生成するものに合わせています。Circe、Play JSON、uPickle はいずれも case class のフィールドを JSON のキーに変換してシリアライズします — ここで得られる結果もまさにそれです。Int、Long、Double、BigDecimal は JSON の数値になります。Boolean はそのまま真偽値です。Option[A] は Some(x) のときは値になり、None のときは null または省略されます。Instant、LocalDateTime、その他の java.time 型は ISO-8601 の文字列として出力されます。
コレクションの扱いも素直です。List、Seq、Vector、Set はすべて JSON 配列になります。Map[String, A] は JSON オブジェクトに。タプル は異なる型の値を持つ JSON 配列になります。case class の子を持つ sealed trait(ADT)を貼り付けると、各バリアントはそれぞれの形でシリアライズされ、パーサーは主要ライブラリが使う ADT の discriminator パターンを認識します。1 つのファイル内にあるトップレベルのクラスを複数貼り付ければ(インスピレーションが欲しければ Scala リポジトリ を参照)、それぞれが独立した JSON エントリとして出力されます。
使い方
ステップは 3 つ。case class 1 つでもモデルファイル丸ごとでも同じ流れです。
Scala を貼り付ける(またはサンプルを試す)
左側のエディタに Scala をそのまま貼り付けてください。case class、sealed trait 階層、インスタンス、複数クラス — どれでも問題ありません。まず実例を見たい場合は サンプルを読み込む を押してください。
import 文、package 宣言、アノテーションはそのままで大丈夫です。データでないものはパーサーが無視します。言語仕様の詳細は docs.scala-lang.org が公式リファレンスです。
「変換」を押す
緑の 変換 ボタンをクリックしてください。ツールは Scala を読み取り、すべてのクラスとフィールドを辿り、一度に JSON を生成します。処理中は短いローディング表示が出ます。
JSON をコピーする
右側のパネルにインデント済みの JSON が表示されます。ScalaTest の spec、Akka HTTP のモックレスポンス、Play の fixture、API ドキュメントなどにそのまま貼り付けてください。
実際に便利な場面
ScalaTest の fixture
Scala サービスのテストで HTTP クライアントをスタブするための JSON ボディが必要なとき。case class を貼り付けてペイロードを取得し、spec に差し込むだけです。
Akka / Play の HTTP ペイロード
自分のサービスに POST するための JSON を case class から起こせます。新しいエンドポイントを組む際の curl 動作確認にも便利です。
Kafka メッセージのサンプル
新しい Kafka トピック向けのサンプル JSON メッセージを、ドメインの case class から直接生成できます — 時間とともにずれていく手書きのサンプルは不要です。
コードと一致するドキュメント
API ドキュメント向けの JSON 例を、実際の case class から直接作れます。モデルが変わってもドキュメントが正しい状態を保てます。
よくある質問
Option の値はどうシリアライズされますか?
Some(x) は値 x になり、None は JSON の null になります。Circe のデフォルト挙動と同じです。None のキーを省略したい場合は、後処理で取り除けます — デフォルトは形を予測しやすくするためのものです。
sealed trait と ADT はどう扱われますか?
case class を子に持つ sealed trait は、各バリアントごとにシリアライズされます。複数のバリアントが親 trait を共有している場合は、Circe や Play JSON で使われる一般的な discriminator パターン({"type": "OrderPlaced", ...})が適用されるので、データを ADT に戻すラウンドトリップが可能です。
java.time 型の扱いは?
Instant、LocalDate、LocalDateTime、ZonedDateTime は ISO-8601 の文字列としてシリアライズされます。Circe、Play JSON、uPickle に共通する慣例で、java.time へのラウンドトリップもきれいに行えます。
Map、List、Vector、Set は扱えますか?
はい。List、Seq、Vector、Set はすべて JSON 配列になります。Map[String, A] は JSON オブジェクトに — 文字列キーでない map(Map[Int, A])は、JSON が文字列キーしかサポートしないため、キー/値ペアの配列として出力されます。
複数の case class が入ったファイルを丸ごと貼り付けても大丈夫?
はい。トップレベルのクラスはそれぞれ独立した JSON エントリになり、ネストされたインスタンスは展開されます。companion object、暗黙の変換、ヘルパーメソッドはスキップされ、データだけが出力に反映されます。
コードは保存されますか?
貼り付けた Scala は変換のためにバックエンドに送られますが、永続化はしません。ペイロードのログも取りません。機密性の高いコードの場合は、貼り付ける前に内容を確認してください。
関連して使えるツール
Scala → JSON はあくまで一部です。次のツールと組み合わせると便利です: