100 % local — vos données ne quittent jamais votre navigateur

JSON en Scala — des case classes, clés intactes

Transformez un échantillon JSON en case classes Scala. Les champs gardent les clés JSON, entre accents graves si besoin, prêts pour votre codec.

Instantané Privé Zéro cookie

Entrée JSON

Sortie Scala

Ce que fait cet outil

Un échantillon JSON devient des case class Scala, une par objet.

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

case class Address(
  city: String
)

Un tableau d’objets à la racine reçoit lui aussi un nom : type Root = List[RootItem], un alias de haut niveau, donc Scala 3.

Les accents graves gardent la clé

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

Scala prend pour identifiant tout ce qui est entre accents graves : le nom du champ peut donc rester exactement ce que disait le JSON. Ce n’est pas un choix cosmétique : circe, zio-json et upickle dérivent tous le nom JSON du nom de champ, si bien que cette case class lit votre charge telle quelle, sans annotation ni décodeur sur mesure.

L’autre voie — renommer en contentType — demanderait un codec configuré pour le rattacher, et un échantillon ne peut pas dire quelle bibliothèque vous employez.

Les types, et les deux qui avouent leur ignorance

Les entiers deviennent Long et les décimaux Double : un nombre JSON ne tient de façon fiable ni dans un Int ni dans un Float, et élargir vaut mieux qu’un dépassement silencieux.

null, un tableau vide et un tableau mêlé deviennent tous Any, exactement aussi vague que l’échantillon. Any est inconfortable en Scala, et cet inconfort est le but : il marque les champs sur lesquels le document ne vous a rien dit, et ne prétend pas le contraire.

Ce qu’un échantillon ne peut pas dire

Aucun champ n’est une Option, aucun n’a de valeur par défaut, et rien n’est un sealed trait : un document montre une forme. Si deux charges diffèrent d’une clé, c’est une union que vous modélisez vous-même — et l’endroit où un type engendré cesse d’être utile, où votre conception commence.

Confidentiel par conception

Tout s’exécute localement dans votre navigateur en JavaScript. Vos données ne sont jamais envoyées sur un serveur, ce qui rend l’outil sûr pour des contenus sensibles, et il fonctionne hors ligne.

Questions fréquentes

Pourquoi certains noms de champs sont-ils entre accents graves ?
Parce que Scala accepte n’importe quel identifiant entre accents graves, et que cela garde la clé JSON comme nom de champ. `content-type` et `class` seraient illégaux autrement. Ce n’est pas qu’une question d’allure : les bibliothèques à dérivation comme circe emploient le nom du champ comme nom JSON, donc garder la clé fait décoder votre document sans une seule annotation.
Pour quelle bibliothèque JSON est-ce prévu ?
Pour n’importe laquelle à dérivation — circe, zio-json, upickle — puisqu’elles lisent toutes les noms de champs. Aucun import ni annotation n’est émis : rien ici ne vous lie à l’une d’elles. Avec le module Scala de Jackson, même chose ; seul un champ que vous renommez à la main demande un `@JsonProperty`.
Pourquoi rien n’est-il une `Option` ?
Parce qu’un échantillon montre une présence, jamais une absence. Chaque champ était là, donc chaque champ est obligatoire — et `Option[String]` est la retouche à faire quand vous saurez que la clé peut manquer. Tout rendre optionnel d’emblée transformerait chaque accès en `getOrElse` sans que le document l’appuie.

Convertisseurs associés