100 % lokal — Ihre Daten verlassen nie Ihren Browser

JSON in Scala — Case-Klassen, Schlüssel erhalten

Ein JSON-Beispiel in Scala-Case-Klassen verwandeln. Die Feldnamen behalten die JSON-Schlüssel, in Backticks wo nötig — bereit für Ihren Codec.

Sofort Privat Null Cookies

JSON-Eingabe

Scala-Ausgabe

Was dieses Werkzeug tut

Aus einer JSON-Probe werden Scala-Case-Classes, eine je Objekt.

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

case class Address(
  city: String
)

Auch ein Array von Objekten an der Wurzel bekommt einen Namen: type Root = List[RootItem], ein Alias auf oberster Ebene, also Scala 3.

Backticks bewahren den Schlüssel

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

Scala nimmt alles zwischen Backticks als Bezeichner: der Feldname darf also genau das bleiben, was das JSON sagte. Keine Frage der Kosmetik — circe, zio-json und upickle leiten den JSON-Namen alle aus dem Feldnamen ab, sodass diese Case Class Ihre Nutzlast so liest, wie sie ist, ohne Annotation und ohne eigenen Decoder.

Der andere Weg — die Umbenennung zu contentType — verlangte einen konfigurierten Codec, der ihn zurückbindet, und eine Probe kann nicht sagen, welche Bibliothek Sie nutzen.

Typen, und die zwei, die ihr Nichtwissen zugeben

Ganzzahlen werden Long, Dezimalzahlen Double: eine JSON-Zahl passt verlässlich weder in ein Int noch in ein Float, und breiter ist besser als ein stiller Überlauf.

null, ein leeres Array und ein gemischtes Array werden alle Any — genauso vage wie die Probe. Any ist in Scala unbequem, und diese Unbequemlichkeit ist der Zweck: sie markiert die Felder, zu denen das Dokument nichts sagte, und tut nicht so, als wäre es anders.

Was eine Probe nicht sagen kann

Kein Feld ist eine Option, keines hat einen Vorgabewert, und nichts ist ein sealed trait: ein Dokument zeigt eine Form. Unterscheiden sich zwei Nutzlasten um einen Schlüssel, ist das eine Union, die Sie selbst modellieren — und die Stelle, an der ein erzeugter Typ aufhört zu nützen und Ihr Entwurf beginnt.

Datenschutz ab Werk

Alles läuft lokal in deinem Browser mit JavaScript. Deine Daten werden nie hochgeladen, wodurch das Tool auch für sensible Inhalte sicher ist und offline funktioniert.

Häufige Fragen

Warum stehen manche Feldnamen in Backticks?
Weil Scala dazwischen jeden Bezeichner zulässt, und das den JSON-Schlüssel als Feldnamen bewahrt. `content-type` und `class` wären sonst unzulässig. Das ist mehr als Optik: Bibliotheken mit Ableitung wie circe nehmen den Feldnamen als JSON-Namen, der Schlüssel bleibt also erhalten und die Case Class dekodiert Ihr Dokument ohne eine einzige Annotation.
Für welche JSON-Bibliothek ist das gedacht?
Für jede mit Ableitung — circe, zio-json, upickle —, denn alle lesen die Feldnamen. Es werden weder Importe noch Annotationen ausgegeben: nichts bindet Sie hier an eine. Mit Jacksons Scala-Modul gilt dasselbe; nur ein von Hand umbenanntes Feld braucht `@JsonProperty`.
Warum ist nichts eine `Option`?
Weil eine Probe Anwesenheit zeigt, nie Abwesenheit. Jedes Feld war da, also ist jedes Pflicht — und `Option[String]` ist die Änderung, sobald Sie wissen, dass der Schlüssel fehlen darf. Alles vorab optional zu machen verwandelte jeden Zugriff in ein `getOrElse`, ohne dass das Dokument es stützte.

Ähnliche Konverter