本文へスキップ

JSONをScalaケースクラスに変換 — Numio

JSON サンプルを Scala の case class に変換します。ネストしたオブジェクトは別の case class、配列は Seq[...] になり、null 値と配列の一部の要素にしかないキーは Option[...] になります。

Circe、Play JSON、uPickle のコーデックを追加する前に、JSON API のモデルの下書きを作る。

JSON

Scala Case Class

こんなときに使えます

  • Circe、Play JSON、uPickle のコーデックを追加する前に、JSON API のモデルの下書きを作る。
  • Kafka や HTTP のサンプルペイロードを Spark や Akka のジョブで使う case class にする。

使い方

  1. JSON オブジェクトを貼り付けます。省略可能なフィールドがある場合は、キーの異なる配列要素を複数含めます。
  2. 出力を確認します。ルートのクラス名は RootInterface で、ネストしたクラスはキー名の PascalCase で命名されます(speakers は Speakers になります)。
  3. クラスをコピーして名前を変え、サンプルから型を決められなかった Option[Any] や Seq[Any] を具体的な型にします。

JSON 入力

{
  "id": 7,
  "type": "conference",
  "price": 49.9,
  "venue": null,
  "tags": ["jvm", "fp"],
  "speakers": [
    { "name": "Martin", "talk": "Keynote" },
    { "name": "Li", "talk": "Effects", "slides": "https://example.com/s.pdf" }
  ]
}

Scala case class

case class RootInterface(
  id: Int,
  `type`: String,
  price: Double,
  venue: Option[Any],
  tags: Seq[String],
  speakers: Seq[Speakers]
)

case class Speakers(
  name: String,
  talk: String,
  slides: Option[String]
)

仕様と制限

サイト独自のジェネレーターでブラウザ内で実行され、サーバーへの呼び出しはありません。設定項目はなく、import やコーデックの derive も追加しません。

配列の全要素がマージされます。一部の要素で欠けているキーや null のキーは Option[...] になり、12 と 1.5 が混在すると Double になります。

常に null の値は Option[Any]、空配列は Seq[Any] になります。サンプルに示す型がないためです。

予約語や識別子として使えないキーは `type` のようにバッククォートで囲まれます。snake_case のキーはそのまま残ります。

FAQ

null 許容フィールドに Option は生成されますか?

はい。値が null のキーは Option[...] になります。同じキーに実際の値を持つサンプルがあればその型、なければ Option[Any] です。配列の一部の要素にしかないキーも Option になります。

ルートが JSON 配列の場合はどうなりますか?

要素が 1 つの RootInterface case class にマージされ、一部の要素にしかないキーは Option になります。さらに type RootInterfaceList = Seq[RootInterface] が追加されます。

64 ビットの ID は Long になりますか?

サンプルの値が Int の範囲(約 ±21 億)を超える場合だけです。それ以外の整数は Int になるので、大きくなりうる ID やタイムスタンプは Long に変更してください。

仕様を確認する