Découvrez comment utiliser le format JSON qui est très utilisé dans le web, mais aussi qui est complètement utilisable avec Unity. Ce format permet de structurer des données plus ou moins complexes, avant de les transmettre, par exemple, à une autre partie de l'application ou vers une application tierce.
Dérivé de la notation objet du javascript, le JavaScript Object Notation (JSON) permet de représenter de l’information structurée comme le permet XML par exemple.
Ce format fut créé par Douglas Crockford entre 2002 et 2005, on peut retrouver sa description dans la RFC 7159 de l’IETF.
Quel format utiliser ? JSON, YAML ou XML ?
Il faut savoir que le format JSON n'est pas le seul format texte (par opposition aux formats binaires) de structuration de données qui existe. En effet on peut trouver dans son sillage d'autres formats très utilisés, comme le XML ou le YAML.
Histoire de mieux visualiser de quoi il retourne, penchons nous sur les exemples ci-dessous. Ces exemples présentent les mêmes données selon les 3 formats cités.
Exemple JSON
{
"player": {
"pseudo": "terminator",
"xp": "205",
"backpack": {
"item": [
{ "name": "potion", "nbre": "3" },
{ "name": "bullet", "nbre": "105" }
]
}
}
}
Ainsi on a ici à première vue un objet "player" qui est composé de 3 membres : "pseudo", "xp" et "backpack". Ce dernier est composé d'un tableau "item", contenant 2 éléments.
Exemple XML
<player pseudo="terminator" xp="205">
<backpack>
<item name="potion" nbre="3" />
<item name="bullet" nbre="105" />
</backpack>
</player>
On notera ici l'obligation de fermer systématiquement les balises ouvertes, ce qui rend ce format assez lourd. Cependant les imbrications et les notions de parenté sont plus facilement visibles avec le XML.
Exemple YAML
player:
pseudo: terminator
xp: 205
bacpack:
item:
- name: potion
nbre: 3
- name: bullet
nbre: 105
Le YAML, qui est un format plus récent, possède l'avantage d'être bien plus lisible pour un humain, et il dispose de plus de fonctionnalités comme la possibilité d'utiliser des commentaires dans le fichier, ou encore les ancres relationnelles, au contraire du JSON.
Quel format choisir ?
La réponse est bien sûr nuancée sans pouvoir trancher au profit d'un format plutôt qu'un autre...En effet chacun possède ses forces et faiblesses, et surtout cela dépend en réalité des besoins de votre application !!
Symfony (framework web) ou encore Drupal (CMS - web) utilisent par exemple le YAML pour leur format d'entrée et de sortie, tandis que Joomla (CMS - web) utilise plutôt le XML pour la description de ses templates.
Mais dans le domaine du web, le format JSON est aussi très utilisé, comme par exemple en AJAX lors de l'appel à certaines API web. C'est d'ailleurs la technologie AJAX qui a fait connaître ce format au grand public.
Il est toutefois à noter que le format JSON semble plus indiqué si les données ne sont pas trop complexes et/ou trop imbriquées. De plus le JSON ne dépend d'aucun langage et surtout il est pris en charge par bon nombre d'entre eux : Javascript, Php, Perl, Python, Ruby, Java,...
Créer son premier objet JSON
La description des données peut être écrite dans un fichier .json, puis lue par notre application, comme on le ferait avec un fichier de sauvegarde. On peut aussi coder dynamiquement l'objet JSON, puis le remplir avec les données d'un autre objet de notre application, pour enfin le passer à un serveur web via une requête http.
Dans le cadre de la programmation de jeux vidéos, le format JSON peut réellement vous être très utile.
Premier contact avec le JSON
Le format JSON utilise un sytème de clé/valeur pour représenter les données, un peu comme un dictionnaire. Si on reprend notre premier exemple, présenté plus haut, on retrouve par exemple :
"pseudo": "terminator"
Ici la clé est "pseudo" et sa valeur est une chaîne de caractères (string en C#, String en Java...), soit "terminator".
Mais la valeur peut aussi être un tableau :
"item": [
{ "name": "potion", "nbre": "3" },
{ "name": "bullet", "nbre": "105" }
]
Sur la suite de notre exemple on trouve "item" qui est la clé et sa valeur qui est bien un tableau. Notez bien les crochets [].
De plus ce tableau contient 2 items, qui sont ici des objets, contenant chacun 2 paires de clé/valeur... Mais on aurait pu avoir un objet, lui même avec d'autres objets et/ou tableaux et ainsi de suite. Comprenez qu'il n'y a pas de limite à la structuration de vos données.
En clair vous organisez comme vous voulez vos données !!
Enfin on pourrait très bien décider que la valeur de la clé "nbre" est un entier et non plus une chaîne de caractères...ainsi on écrirait :
"item": [
{ "name": "potion", "nbre": 3 },
{ "name": "bullet", "nbre": 105 }
]
Syntaxe du JSON
Après ce premier plongeon dans le format JSON voyons officiellement sa syntaxe .
- Un objet est défini par des accolades { membre1, membre2 ... }, les membres doivent être séparés par des virgules.
- Un membre est représenté par un couple "clé":valeur
- Le type de la valeur peut être : objet, tableau, nombre (entier ou décimal), chaîne de caractères, true, false, null
- Un tableau est représenté par des crochets [ ], et il peut contenir lui même des objets ou tout autre type.
Et voilà tout ce que vous avez besoin de savoir sur la syntaxe du format JSON...passons à la pratique !!
Simple, efficace et compact.
Un premier objet JSON
Nous allons voir ici comment représenter des données issues d'un jeu vidéo.
Les données à utiliser sont les suivantes:
- l'identifiant unique du joueur : "#2675FUI"
- son nombre de diamants : 4239
- les informations sur ses champs construits : les champs sont des objets qui permettent de référencer la position (x,y,z), l'état de la production (un chiffre décimal entre 0 et 1), le niveau actuel du champ
Ce joueur possède 2 champs :
- Le premier champ est placé en (0,0.3,0), production à 90%, niveau 2
- Le second est en (3,2.5,0.7), production à 22%, niveau 5
Comment représenter ces données ?
On commencera par noter que l'on a trois clés : identifiant, nombre de diamants, les champs. Ensuite chaque champ est un objet, composé de trois clé : position, production, niveau.
La difficulté réside dans la représentation de la position, mais en peut s'en sortir un voyant notre vecteur position comme un tableau de 3 cellules.
Ainsi une solution serait :
{
"identifiant":"#2675FUI",
"diamants":4239,
"champs": [
{"position":[0,0.3,0],"production":0.9,"niveau":2},
{"position":[3,2.5,0.7],"production":0.22,"niveau":5}
]
}
N 'hésitez à penser une autre architecture, le tout c'est d'avoir un code valide...pour cela faites un tour sur ce validateur, copier-coller votre code et cliquez sur "process".
Rendez vous sur un prochain tutoriel avec Unity pour poursuivre votre apprentissage sur l'utilisation du format JSON.