Zum Inhalt springen

JSON in Scala-Case-Classes umwandeln — Numio

Wandelt ein JSON-Beispiel in Scala-Case-Classes um. Verschachtelte Objekte werden zu eigenen Case-Classes und Arrays zu Seq[...]; null-Werte und Schlüssel, die in einigen Array-Elementen fehlen, werden zu Option[...].

Modelle für eine JSON-API entwerfen, bevor ein Circe-, Play-JSON- oder uPickle-Codec hinzukommt.

JSON

Scala Case Class

Wann sie hilft

  • Modelle für eine JSON-API entwerfen, bevor ein Circe-, Play-JSON- oder uPickle-Codec hinzukommt.
  • Ein Beispiel-Payload aus Kafka oder HTTP in Case-Classes für einen Spark- oder Akka-Job umwandeln.

Anwendung

  1. Füge ein JSON-Objekt ein; für optionale Felder nimm mehrere Array-Elemente mit unterschiedlichen Schlüsseln auf.
  2. Prüfe die Ausgabe: Die Root-Klasse heißt RootInterface, verschachtelte Klassen werden nach ihren Schlüsseln in PascalCase benannt (speakers wird zu Speakers).
  3. Kopiere die Klassen, benenne sie um und präzisiere jedes Option[Any] oder Seq[Any], das das Beispiel nicht typisieren konnte.

JSON-Eingabe

{
  "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-Classes

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]
)

Details und Einschränkungen

Läuft im Browser mit dem eigenen Generator der Seite; kein Serveraufruf. Die Seite hat keine Einstellungen und fügt keine Imports oder Codec-Ableitungen hinzu.

Alle Elemente eines Arrays werden zusammengeführt: Ein Schlüssel, der in einigen Elementen fehlt oder dort null ist, wird zu Option[...], und 12 neben 1.5 wird zu Double.

Ein Wert, der immer nur null ist, ergibt Option[Any] und ein leeres Array Seq[Any], weil das Beispiel keinen Typ zeigt.

Reservierte Wörter und Schlüssel, die keine Bezeichner sind, werden in Backticks gesetzt, etwa `type`; snake_case-Schlüssel bleiben wie geschrieben.

FAQ

Erzeugt es Option für nullable Felder?

Ja. Ein Schlüssel mit dem Wert null wird zu Option[...], typisiert anhand der anderen Beispiele, wenn der Schlüssel auch echte Werte hat, sonst Option[Any]. Schlüssel, die in einigen Array-Elementen fehlen, werden ebenfalls Option.

Was passiert mit einem JSON-Array auf oberster Ebene?

Seine Elemente werden zu einer einzigen Case-Class RootInterface zusammengeführt, wobei in einigen Elementen fehlende Schlüssel Option sind, und type RootInterfaceList = Seq[RootInterface] wird ergänzt.

Wird eine 64-Bit-ID als Long typisiert?

Nur wenn ein Beispielwert außerhalb des Int-Bereichs liegt (etwa ±2,1 Milliarden). Andere ganze Zahlen werden zu Int; ändere IDs oder Zeitstempel daher in Long, wenn sie wachsen können.

Spezifikationen und Referenzen