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.