Principe de base et objectifs
TSON (Typed Schema Object Notation) se présente comme un sur‑ensemble de JSON dont chaque document indique explicitement le schéma qui le valide. Le schéma, à son tour, référence son méta‑schéma et sa bibliothèque de types via un hachage cryptographique. Cette chaîne de hachage garantit l’intégrité du document : toute modification du schéma ou du méta‑schéma rompt la correspondance et empêche la validation tant que le re‑pin n’est pas exécuté. Le texte indique que les schémas TSON coûtent un tiers des tokens d’un JSON Schema classique, ce qui réduit la charge de transmission dans les appels d’API d’IA.
Implémentations et flux de validation
Deux implémentations sont disponibles : tson-java, une référence en Java, et tson-typescript, qui fonctionne dans le navigateur. Le processus de validation suit un unique lexer et une chaîne d’outils partagée entre schéma et données. L’exemple de ligne de commande montre la création d’un couple schéma/données (person.tn et person-data.tn) puis la validation :
$ git clone https://github.com/litterat/ltr8-io-tson-java.git
$ cd ltr8-io-tson-java && ./gradlew :tson-cli:installDist
$ export PATH="$PWD/tson-cli/build/install/tson/bin:$PATH"
$ tson init-example
Wrote ./person.tn and ./person-data.tn.
$ tson validate person.tn person-data.tn
OKEn cas d’erreur (par ex. un champ supprimé ou une valeur mal typée), le validateur renvoie chaque problème avec son chemin d’accès et la raison, ce qui facilite le débogage automatisé.
Langage de schéma : constructions et contraintes
Le langage TSON définit cinq états de champ : obligatoire (par défaut), valeur par défaut (~), valeur figée (=), optionnel (?) et explicite. Les collections sont typées : les tableaux homogènes acceptent une taille minimale et maximale ([text; 1..10]), les tuples imposent un ordre fixe ([number, number]) et les ensembles garantissent l’unicité (set<text>). Les cartes utilisent des clés typées, évitant la conversion systématique en chaîne de caractères, comme dans {uuid => employee} ou {date => text; 1..}.
Les atomes et les énumérations permettent de restreindre les valeurs via des plages (min, max), des motifs regex ou des listes de membres. Par exemple : port => !integer ^ { min: 1 max: 65535 } ou status => !integer ^ { members: [200 404 500] }. Les constructions de composition (&) et de soustraction (-) offrent un contrôle précis de l’héritage : le schéma ticket hérite de audit tout en ajoutant de nouveaux champs, tandis que public retire le champ password de account.
Gestion des versions et limites
Chaque version de schéma porte un identifiant de hachage (!!id) et un méta‑schéma (!!meta). L’ajout d’un champ requis, habituellement interdit dans les systèmes mutables comme Protobuf, est possible grâce à la vérification de hachage : le nouveau champ doit être présent dans tous les documents qui référencent la version mise à jour, sinon la validation échoue. Cette approche élimine les ruptures de compatibilité, mais impose une discipline stricte lors de la génération de nouveaux hachages, car chaque modification entraîne la création d’un nouveau URI de schéma.
Le projet reste en phase de révision jusqu’à la version 1.0, ce qui signifie que les API et la syntaxe peuvent évoluer. Les utilisateurs doivent donc suivre les changements de la série 2026 et préparer leurs pipelines d’intégration en conséquence.