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.