JSON
Par neolao, vendredi 17 février 2006 à 15:13 :: Divers
:: #12
::
ekameleon m'a fait découvrir JSON qui est un format de données. Il est léger, facile à lire pour nous et aussi à parser/générer en programmation.
Comment ca marche ?
Des données JSON, c'est simplement du texte. C'est la syntaxe qui est intéressante. D'ailleurs, quand on lit les données, on a carrément l'impression que rien n'a été inventé. Ca semble même tellement évident comme syntaxe qu'on se demande pourquoi on l'a pas utilisé avant.
Comme format simple que j'ai pu utiliser, il y a par exemple le format INI qui permet d'avoir des catégories et des champs avec valeur.
La syntaxe
Sur la page json.org, il y a des graphiques qui montrent la syntaxe, je trouve ça très clair.
Pour un objet :
{"champ1":5,"champ2":"toto","champ3":[1,2,3]}
Pour une liste :
["a","b","c","d"]
Bref, des choses qu'on a l'habitude de manipuler si on travaille déjà avec un langage ECMAScript.
Les outils
Toujours sur la page json.org, il y a des classes et fonctions pour manipuler les données JSON dans chaque langage, donc pour des données du langage en texte JSON et inversement. Bref, c'est de la sérialisation JSON. On peut s'amuser à créer des objets en PHP, les convertir au format JSON pour les importer dans Flash par exemple.
Les limites
Je n'ai pas vu de gestion de référence. Alors j'ai simplement testé ca en Actionscript :
var o:Object = new Object();
o.truc = "coucou";
o.prout = o;
var s:String = JSON.stringify(o);
Ca me fait une boucle infinie avec le script récupéré sur json.org. Donc il a dû essayer de parser prout sans reconnaître qu'il est déjà dessus.
Conclusion
La page officielle est courte et simple. On comprend tout de suite de quoi il s'agit.
Il ne faut cependant pas choisir systématiquement ce format, ca dépend ce qu'on en fait. Dans le billet précédent, on a vu un format en texte, plutot complexe mais qui permet de faire des arbres comme ca :

Donc choisissez bien votre format de données, même si on est plus à l'aise avec certains, ce n'est pas forcément adapté.
Trackbacks
Pour faire un trackback sur ce billet :
http://blog.neolao.com/tb.php?id=12
Commentaires
Par ekameleon, vendredi 17 février 2006 à 16:03
JSON comme tu le dis c'est léger .. mais un peu trop en fait
Manque des trucs.
Par exemple au niveau des objets tu as du remarquer que JSON se base sur une notation Javascript et pas du tout compatible ECMAScript au sens large.
Exemple si tu tapes :
'{"label" : "ekameleon" , "data":2 }' ;
En javascript les " autour des noms de propriétés fonctionnent mais pas en ActionScript par exemple.... pour ma part j'attends d'utiliser EDEN car justement on pourra avoir une sérialisation directement en utilisant une chaine du style :
'{label : "ekameleon" , data:2 }'
Sinon je sais pas si tu as vu en javascript qu'il y a dans tous les objets la méthode toSource() comme pour le toString() ... qui permet de renvoyer en principe la structure sérialisée de ton objet directement... si tu regardes du côté de CORE2 Zwetan à directement fait en sorte que tous les ohjets utilise cette fonctionnalité et une interface ISerializable pour faire en sorte que tous les objets même les non natif puissent en fin de compte se sérializer directement via le toSource()... et là franchement cela permet de récupérer super rapidement les données entre un serveur, flash, du javascript etc... ^_^
EKA+ 
Par neolao, vendredi 17 février 2006 à 17:05
ouais, ca c'est top effectivement
Par grand-mister, vendredi 17 février 2006 à 17:43
Pas mal en effet. Pour transférer des données simples entre flash et serveur, par exemple, c'est plus léger que XML.
Ton test d'objet récurent est assez capyllotracté :D Le bug ne vient-il pas plutôt de la classe JSON.as ? Ca devrait pouvoir se corriger.
Par contre, ta remarque eka est pertinente. C'est quoi EDEN ?
Par ekameleon, vendredi 17 février 2006 à 17:52
EDEN c'est un JSON surboosté et openSource qui va bientôt sortir
L'objectif de Zwetan est au bout du compte de créer un genre de MONO basé ECMAScript 
J'en parle sur mon blog ici :www.ekameleon.net/blog/in...
Je te conseille de t'inscrire sur le NG de Burrrn pour voir ce qu'il en est 
A savoir que pour ma part j'ai un gros parti pris sur cette méthode de sérialisation vu que mon Framework est déjà prés à utiliser EDEN avant même qu'il soit sorti lol
Pour ma part c'est surtout pour des échanges entre Flash Media Server et Flash que cela m'intéresse 
Par zwetan, mardi 21 février 2006 à 08:52
salut 
eden c'est pour "ECMAScript data exchange notation",
c'est proche de json mais ce n'est pas comme json ni mmee inspiré de json (ca je sens que je vais devoir le repeter longtemps mais eden existait deja avant que json fasse parlé de lui, bref).
meme si eden est aussi un subset d'ECMAScript il va un peu plus loin que json, par ex:
- support de différents scope d'objet
"toto = 123; titi = 456;"
- support des références (déclaré dans eden ou en dehors d'eden)
"titi = \"hello world\"; toto = titi; tutu = _global.autreref;"
- support des custom constructor
"toto = new maClass( 1 , 2, 3 );"
mais ca va encore plus loin, le parser eden est fait pour etre configurable (principalement pour des raisons de sécurité)
- on peut par ex parser un string eden dans le scope d'un objet "isolé":
edenstr = "toto = 123; titi = {a:1, b:2};"
myObj = {};
buRRRn.eden.deserialize( edenstr, myObj );
on obtiendra
myObj = { toto:123, titi:{a:1, b:2} };
si on ne précise pas de scope en 2nd param, le scope par défaut est _global
(il y a d'autres param dans les config qui permettent aussi de limiter ou non le parser dans ce qu'il peut parser)
- en plus de eden, il y a edenRR (eden Ridge Racer :p) qui est une lib (client ET server) qui reutilise le format eden pour échanger des données entre un client et un serveur et qui a pour but au final de pouvoir faire aussi du remoting
ex de packet eden:
0xed0000|toto = \"hello world\";
0xed2000|myauthkey|titi = 123456789;
etc.
le header "0xed0000" permet de transporter des infos dans le paquet comme savoir si le paquet contient ou non une AuthorisationKey, ou si le paquet est encodé en RAW ou en Base64, ou si le paquet est encrypté ou non, etc.
tout ca marche pour l'instant en JS, AS1, AS2 et PHP
le but est d'avoir 1 et 1 seul format de données qui puisse aussi bien etre utilisé a partir de flash que d'une appli a base de AJAX (que n'importe ou), que ce soit juste pour échanger des données structurées (WDDX, XML, SOAP, json, etc.) que faire du remoting (AMF, AMFPHP, .NET, etc.),
que faire de la persistence d'objets typés (SharedObject, hibernate, etc.).
eden v0.9 et eden RR v0.5 sortent bientot 
Par neolao, mardi 21 février 2006 à 09:37
intéressant, j'espère que ca sera bien documenté
Par SuperDevy, mercredi 22 février 2006 à 18:25
Ils sont extras leur shémas, manque juste quelques flèches parceque des fois on se paume.
Je viens de découvrir ton blog neo, super intéressant et extra ton design :D