100% ローカル — データがブラウザの外に出ることはありません

JSONをScalaに変換|キーを保ったcase classにする

JSONのサンプルをScalaのcase classに変換します。フィールド名はJSONのキーのまま、必要な場所はバッククォートで囲まれ、codec にそのまま渡せます。

高速 プライベート Cookieゼロ

JSON 入力

Scala 出力

このツールの動作

JSON の標本が Scala の case class になります。オブジェクト一つにつき一つです。

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
case class Root(
  id: Long,
  firstName: String,
  address: Address
)

case class Address(
  city: String
)

根がオブジェクトの配列なら、それにも名前がつきます。type Root = List[RootItem] という最上位の別名で、これは Scala 3 の書き方です。

バッククォートが鍵を保つ

{ "content-type": "text/html", "class": 1 }
case class Root(
  `content-type`: String,
  `class`: Long
)

Scala はバッククォートの中を識別子として受け取るので、項目名は JSON が言ったとおりのままでいられます。これは飾りの選択ではありません。circe も zio-json も upickle も、JSON 名を項目名から導きます。だからこの case class は、注釈も専用の復号器も無しに、あなたの荷をそのまま読みます。

もう一方の道——contentType へ改名する——は、それを結び直す設定済みの codec を要求します。そして、あなたがどのライブラリを使っているかは、標本には分かりません。

型、そして無知を認める二つ

整数は Long、小数は Double になります。JSON の数値は Int にも Float にも確実には収まらず、広く取るほうが、黙って溢れるよりましだからです。

null、空の配列、型の混ざった配列は、いずれも Any になります。標本とちょうど同じだけ曖昧です。Any は Scala では居心地が悪く、その居心地の悪さこそ狙いです。文書が何も語らなかった項目に印を付け、そうでないふりをしません。

標本が言えないこと

Option の項目はなく、既定値もなく、sealed trait もありません。文書ひとつが示すのは一つの形です。二つの荷が鍵一つ分だけ違うなら、それはあなたが設計する合併です。生成された型が役に立たなくなり、あなたの設計が始まる地点でもあります。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

なぜ一部の項目名がバッククォートで囲まれているのですか。
Scala はその中なら任意の識別子を許し、そうすれば JSON の鍵をそのまま項目名にできるからです。`content-type` や `class` は、そうでなければ書けません。見た目だけの話ではありません。circe のような導出に頼るライブラリは項目名を JSON 名として使うので、鍵を保てば、注釈を一つも書かずにこの case class があなたの文書を復号します。
どの JSON ライブラリ向けですか。
導出を使うものならどれでも構いません。circe、zio-json、upickle——いずれも項目名を読むからです。取り込みも注釈も出さないので、ここには特定のライブラリへの縛りがありません。Jackson の Scala 用モジュールでも同じです。手で改名した項目だけが `@JsonProperty` を必要とします。
なぜ `Option` が一つも無いのですか。
標本が示すのは「ある」ことであって、「無い」ことではないからです。どの項目もそこにあったので、どれも必須です。鍵が無いこともあると分かった時点で `Option[String]` に直してください。最初からすべてを省略可能にすれば、文書が支えてもいない理由で、あらゆる参照が `getOrElse` になります。

関連ツール