Bonjour � tous
Suite � quelques discussions sur des sujets voisins, voici quelques �l�ments sur le transport de donn�es via JSON.
JSON est � la base une notation directement issue de javascript. Elle s'est �mancip�e de cette origine mais en garde tout de m�me des traces.
Les types transport�s par JSON sont les types de base de javascript : String, Number, Boolean et les types structur�s Array et Object.
JSON ne pr�voit pas de typer plus fortement les donn�es transmises.
Pas de date, char (date est une classe qui est dans le moteur JS mais pas dans le langage)
Encore moins de structure d�finie par l'utilisateur ni de classes (Javascript n'est pas un langage � base de classe mais un langage � prototype, donc on peut lui ajouter mais ce n'est pas dans sa nature)
Du coup il n'y a rien de pr�cis sur le sujet.
Mais certains utilisent JSON pour inclure des informations de type.
La principale que j'ai trouv�e consiste � inclure des noms de classe.
J'ai trouv� deux �coles : la premi�re vient du monde java. Elle consiste � ajouter en "root �l�ment" le nom de la classeC'est simple mais du coup la structure est chang�e. L� un un AJAX attendaitCode:{"MyPojo":{"id":4, "name":"test"}}
il re�oit un niveau hi�rarchique de plus.Code:{"id":4, "name":"test"}
C�t� PHP (Zend en autre) la solution propos�e consiste � ajouter un membre de plus � l'objetCela implique que l'objet ne peut avoir un membre __ClassName.Code:{"__ClassName":"MyPojo","id":4, "name":"test"}
C'est la m�me approche qu'utilise objective j mais avec une clef diff�rentej'ai trouv� un exemple (non public d�sol�) qui code aussi les types mais �a devient lourdCode:{"__objjClassName":"MyPojo","id":4, "name":"test"}
o pour object, i pour int s pour string etcCode:{"o":"MyPojo":[{"s":"id", "i":45},{"s":"name", "s":"test"};]}
Dans ce cas il faut �crire un parseur sp�cifique pour r�cup�rer son info car il ne contient pas le JSON "standard" dans ses parties.
Cette solution est tr�s proche de php serializeDans le m�me ordre d'id�es mais en mixant les deux approches on peut envisager de transporter la description des types dans un membre et les donn�es ensuite. Mais je n'ai rien trouv� de telCode:O:6:"MyPojo":2:{s:2:"id";i:45;s:4:"name";s:4:"test";}
Tout cela ajoute de la lourdeur et de la complexit�. Comment traiter une description dont les donn�e ne correspondent pas, un int � la place d'un string par exemple etc.Code:
1
2 {"__Types":{"O":{"ClassName":"MyPojo",{"i":"id","s":"name"}}}, "id":4, "name":"test"}
Enfin pour finir une autre approche du probl�me est d'en passer par un sch�ma. Tout comme un XML se d�crit par un xsd un JSON peut �tre d�crit par un sch�ma lui m�me d�finit en JSONCe sch�ma �tant charg� une seule fois ind�pendamment des donn�es pour permettre au parser de faire des v�rification plus strictesCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 {"complexType":{ "name":"MyPojo", "all":[ {"element" {"name":"id", "type":"integer"}} {"element" {"name":"name", "type":"string" }} {"element" { "name":"date", "type":"Date", "restriction":{ "base":"string", "pattern":{"value":"[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}:[0-9]{3}"} } }} ] }}
L'utilisation d'une notation commedevenant suffisante pour typer plus fortement les donn�es.Code:{"__ClassName":"MyPojo","id":4, "name":"test", "date":"2010-11-22 10:58:12:532"}
Bien s�r tout cela n'est pas normalis� et est un peu � l'oppos� de la philosophie de base de JSON qui est par nature (tr�s) faiblement typ�
La solution "root �l�ment" est facile � impl�menter c�t� serveur et n�cessite une adaptation c�t� client pour r�cup�rer les donnes.
la solution "membre" est facile � mettre en �uvre c�t� serveur et est ignor�e par Ajax, elle ne n�cessite une adaptation c�t� client que si l'on veut exploiter les noms de classe.
Les deux ne typent pas les membres.
La solution que j'ai trouv�e qui ressemble � php s�rialize est plus complexe � mettre en �uvre c�t� serveur et me parait tr�s complexe c�t� client. Elle n�cessite d'�crire un PostParser qui apr�s le parser JSON reconstruit l'objet final.
La solution mixte que j'ai extrapol�e dans cet article est presque aussi lourde mais moyennant une petite adaptation on peut r�cup�rer les donn�es comme dans un JSON standard. Je ne voit pas l'utilit� de faire cela.
Transporter le type dans les donn�es est pour moi contre-productif, lourd et complexe.
Je pense que si l'on a un besoin de typage fort une description genre sch�ma (voire plus simple) me para�t plus appropri�e car elle n'influence pas ou peu le trafic. Extjs utilise ce genre de description:A+JYTCode:
1
2
3
4
5
6
7 {fields: [ {name: 'company'}, {name: 'price', type: 'float'}, {name: 'change', type: 'float'}, {name: 'pctChange', type: 'float'}, {name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'} ]}