VT2020-Jsonnet-Fiche

Jsonnet, mot valise de JSON et sonnet, est un langage de création de modèle de données (data templating language en anglais) spécialisé pour le format de données JSON.

=Abstract= ''Jsonnet is a data templating language designed primarily for configuring complex systems. The standard use case is integrating multiple services which do not know about each other. Writing the configuration for each independently would result in massive duplication and most likely would be difficult to maintain. Jsonnet allows you to specify the configuration on your terms and programmatically set up all individual services.'' - Jsonnet Official Website

=Synthèse=

Histoire
Jsonnet, prononcé “jay sonnet” en anglais est un projet ayant vu le jour début 2014 et dont la première version fut lancée le 6 août de la même année.

La conception de Jsonnet est influencée par plusieurs langages de configuration internes à Google. Jsonnet est sous-licence Apache 2.0.

Objectifs Initiaux
JSON est devenu la norme de facto pour la communication de données structurées, tant entre les machines qu'à la frontière entre l'homme et la machine. Toutefois, en grande quantité JSON peut être difficile à gérer pour les humains, en particulier lorsque la duplication doit être maintenue en synchronisation entre les différentes parties de la structure des données. Ces problèmes étaient donc manuellement réglés en écrivant des scripts qui génèrent le JSON. Généralement, ces scripts sont écrits dans des langages de programmation généraux comme Python. Cependant, la maintenance de ces scripts peut être non triviale, en particulier pour les personnes qui ne sont pas familières avec le code de génération.

L'objectif de Jsonnet est donc de régler ses problèmes en créant un langage spécialisé guidé des critères tels que :
 * la familiarité d’écriture, celle-ci devait être proche du JSON
 * la modularité du code
 * le fait d’être puissant mais simple : que les problèmes triviaux le reste mais que l’on puisse gérer des problèmes complexes
 * la rigueur formelle : avoir une spécification faisant autorité

En 2020
Le 22 mai 2020 Jsonnet lance la version v0.16.0. Pour plus d’informations sur les différentes versions voir le GitHub du projet.

Caractéristiques de Jsonnet
Jsonnet est un data templating language, autrement dit un langage qui permet aux développeurs de prendre des données et de les insérer dans un format structuré, dédié au format JSON. Jsonnet est une extension de JSON, à partir d’un fichier .jsonnet l’utilisateur va pouvoir générer des fichiers au format JSON. En conséquence, tout fichier JSON valide est un fichier Jsonnet valide.

Rappels JSON
Pour rappel JSON est un format de données souvent utilisé pour effectuer des requêtes AJAX et qui va permettre de stocker des informations. Ces informations sont stockées dans un document qui comprend deux types d’éléments :
 * des ensembles de paires « nom » (alias « clé ») / « valeur »
 * des listes ordonnées de valeurs

Exemple de fichier .json : {   "employees": [ {           "firstName": "John", "lastName": "Doe" },       {            "firstName": "Anna", "lastName": "Smith" },       {            "firstName": "Peter", "lastName": "Jones" }   ] } La syntaxe de JSON est donc très limitée et rigoureuse: les simples quotes ne sont pas autorisées, toutes les clés doivent être entre doubles quotes…

Fonctionnalités Jsonnet
Tandis que le format JSON va décrire les données littéralement, Jsonnet va ajouter des constructions pour générer, traduire et affiner les données ce qui va se traduire par : Pour voir toutes les fonctionnalités disponibles voir le site officiel de Jsonnet.
 * une syntaxe plus libre : on peut ajouter des commentaires au code, double quote et simple quote peuvent être utilisées mais les clés n’ont plus à être entre double quote
 * des variables : on peut déclarer des variables ce qui évite une grande partie des duplications de code présentes en JSON
 * des fonctions : comme en Python, les fonctions ont des paramètres positionnels, des paramètres nommés et des arguments par défauts.
 * des opérations : on peut réaliser des calculs arithmétiques et booléens
 * des conditions : sous la forme if then else
 * des références : self référence l’objet courant tandis que $ désigne l’objet les plus extérieur
 * des imports

Exemple de fichier .jsonnet : // Edit me! { person1: { name: "Alice", welcome: "Hello " + self.name + "!", }, person2: self.person1 { name: "Bob" }, }

Le fichier .json obtenu à partir du fichier .jsonnet : { "person1": { "name": "Alice", "welcome": "Hello Alice!" }, "person2": { "name": "Bob", "welcome": "Hello Bob!" } } - Site Officiel de Jsonnet

Jsonnet est donc également un langage de sérialisation. Il va coder les informations d’un fichier JSON de manière plus succincte, cette particularité va donc être très utile en termes de relecture du code.

Interpréteur et API
A l’heure actuelle, Jsonnet dispose de deux interpréteurs officiels : un en C++ disponible ici et un en Go disponible ici. Il dispose également d’API pour Python et C++. Des API non-officielles existent également pour Go, LuaJIT, Node.js, PHP, Ruby et Rust.

Output
Bien que principalement dédié au format JSON, Jsonnet peut produire n’importe quel format qui peut être représenté en JSON. Jsonnet va donc pouvoir générer des fichiers .ini ou .svg qui demanderont toutefois une sérialisation personnalisée. Pour voir ces exemples de générations, rendez-vous sur le site officiel de Jsonnet.

Utilisation de Jsonnet
Jsonnet compte une communauté assez active pour Kubernetes. En 2017, l’entreprise Databricks a écrit un article : “Declarative Infrastructure with the Jsonnet Templating Language” détaillant son utilisation du langage Jsonnet dans la configuration d’infrastructure Kubernetes.

Comparaison avec CUE
Article de comparaison entre CUE et Jsonnet : ici. On pourrait se demander si depuis la création de Jsonnet d’autres langages n’ont pas été créés qui pourraient concurrencés Jsonnet. CUE, Configure Unity Execute, est un langage pouvant faire concurrence à Jsonnet. En effet, ce langage né en 2018 gère l’intégration de nombreux format de données, plus que Jsonnet. De plus CUE est fait pour l’automatisation donc il va également gérer la validation de schémas, ce que Jsonnet ne fait pas. CUE peut donc générer du code JSON Comme on peut le voir sur l’image ci-dessous.



Toutefois le code généré ne semble pas être très adapté pour le JSON. Si on ajoute à cela que la notation de CUE est très stricte, CUE ne semble donc pas être le choix optimal pour générer des fichiers JSON.

=Démonstration= La démonstration concernant Jsonnet est disponible [ici].

=Sources=
 * Templating Langage
 * Site officiel Jsonnet
 * GitHub C++ de Jsonnet
 * GitHub Go de Jsonnet
 * Site officiel JSON
 * Wikipédia : JSON
 * Wikipédia : Sérialisation
 * Site officiel Kubernetes
 * Site officiel CUE
 * Article de Databricks sur l’utilisation de Jsonnet
 * Article de comparaison entre CUE et Jsonnet

=Veille Technologique=
 * Année : VT2020
 * Sujet : Jsonnet
 * Slides : Slides
 * Auteurs : User:Alexandra.Chaton