Informations obsolètes à partir de la V13 PTF05

Depuis la V13 PTF05, l'ordre CONV_DONNEES intégré à Adélia permet directement de convertir du JSON en XML et réciproquement, rendant cette fiche obsolète.

 

 

 

Le format JSON n'est pas directement supporté par Adélia Web.

Manipulation coté serveur d'application

La seule solution est d'utiliser une bibliothèque externe dont les fonctions seraient appelées via l'ordre APPELER_CLASS.

A partir de la version 11 d'Adélia Studio, une bibliothèque de classes Java (json.jar) a été introduite pour des besoins internes. Cette bibliothèque se trouve dans le sous-répertoire WEB-INF\lib de chaque application Web générée par Adélia Web.

Le but de ce document est de montrer un exemple d'intégration d'une bibliothèque pour la manipulation d'objets JSON.
Une explication du format JSON se trouve ici : http://www.json.org/.

La bibliothèque Java json.jar est téléchargeable ici : http://www.json.org/java/json.zip
L'aide en ligne de cette bibliothèque se trouve ici : http://www.json.org/java/index.html

Cette bibliothèque offre une gestion complète du format JSON (via des méthodes Java). Afin de simplifier l'exemple, nous allons nous intéresser à une des fonctionnalités offertes permettant la conversion JSON <-> XML. Le but étant de manipuler un objet JSON à partir de son équivalent sous la forme d'un document XML; celui-ci pouvant être manipulé directement en Adélia à l'aide des ordres XML (Le support des ordres XML doit se faire en cochant "Intégration XML" lors de la mise à jour du site Web).

Lors de la conversion d'un document XML au format JSON, les éléments suivants ne sont pas pris en compte :

  • le prologue XML,
  • les commentaires,
  • la déclaration du doctype.


On définit une bibliothèque d'interface entre Adélia et la bibliothèque json.jar :

 sampleXMLJSONConverter.class

sampleXMLJSONConverter.java

 

Cette nouvelle bibliothèque offre les méthodes suivantes :

- XMLStringtoJSONString : Conversion d'un document XML sous la forme d'une chaîne alphanumérique en objet JSON équivalent sous la forme d'une chaîne alphanumérique

Les paramètres :
ALPHA(...) xmlDoc : document XML à convertir,
ALPHA(...) jsonDoc : chaîne alphanumérique devant recevoir le résultat de la conversion,
NUM_BIN_4 lgJSONDoc : Nombre de caractères défini lors de la déclaration de jsonDoc,
NUM_BIN_2 codeRet : Code retour de l'opération. Les valeurs possibles sont :
0 : ok,
-1 : la taille max de la chaîne alphanumérique devant recevoir le résultat est insuffisante,
-2 : erreur lors de la conversion.

Exemple :

 

alpha(3000) xml_string
alpha(2000) json_string
xml_idf docXML
num_bin_2 codeRet
* Creation d'un document XML
* <?xml version="1.0" encoding="ISO-8859-1"?>
* <racine>
* <fils1>paul</fils1>
* <fils2>robert</fils2>
* </racine>
xml_ouvrir docXML *ecriture *var_doc(xml_string) *encodage_fic('ISO-8859-1')
xml_creer_noeud docXML *fils 'racine'
xml_creer_noeud docXML *fils 'fils1'
xml_creer_val docXML 'paul'
xml_creer_noeud docXML *FRERE 'fils2'
xml_creer_val docXML 'robert'
xml_fermer docXML
appeler_class 'sampleXMLJSONConverter' 'XMLStringtoJSONString' xml_string json_string 2000 codeRet
* Le resultat de la conversion dans json_string est :
* {"racine":{"fils1":"paul","fils2":"robert"}}

 

- XMLBlobtoJSONString : Conversion d'un document XML sous la forme d'un blob en objet JSON équivalent sous la forme d'une chaîne alphanumérique

Les paramètres :
IMAGE xmlDoc : document XML sous à forme d'un blob à convertir,
ALPHA(...) encoding : encodage utilisé lors de la création du document XML
ALPHA(...) jsonDoc : chaîne alphanumérique devant recevoir le résultat de la conversion,
NUM_BIN_4 lgJSONDoc : Nombre de caractères défini lors de la déclaration de jsonDoc,
NUM_BIN_2 codeRet : Code retour de l'opération. Les valeurs possibles sont :
0 : ok,
-1 : la taille max de la chaîne alphanumérique devant recevoir le résultat est insuffisante,
-2 : erreur lors de la conversion,
-3 : l'encodage utilisé lors de la création du document XML n'est pas supporté.


Exemple :

 

image xml_blob
alpha(2000) json_string
xml_idf docXML
num_bin_2 codeRet
* Creation d'un document XML
* <?xml version="1.0" encoding="ISO-8859-1"?>
* <racine>
* <fils1>paul</fils1>
* <fils2>robert</fils2>
* </racine>
xml_ouvrir docXML *ecriture *var_doc(xml_blob) *encodage_fic('ISO-8859-1')
xml_creer_noeud docXML *fils 'racine'
xml_creer_noeud docXML *fils 'fils1'
xml_creer_val docXML 'paul'
xml_creer_noeud docXML *FRERE 'fils2'
xml_creer_val docXML 'robert'
xml_fermer docXML
appeler_class 'sampleXMLJSONConverter' 'XMLBlobtoJSONString' xml_blob 'ISO-8859-1' json_string 2000 codeRet
* Le resultat de la conversion dans json_string est :
* {"racine":{"fils1":"paul","fils2":"robert"}}

 


- JSONStringtoXMLString : Conversion d'un objet JSON sous la forme d'une chaîne alphanumérique en document XML équivalent sous la forme d'une chaîne alphanumérique

Les paramètres :
ALPHA(...) jsonlDoc : objet JSON à convertir,
ALPHA(...) xmlDoc : chaîne alphanumérique devant recevoir le résultat de la conversion,
NUM_BIN_4 lgXmlDoc : Nombre de caractères défini lors de la déclaration de xmlDoc,
NUM_BIN_2 codeRet : Code retour de l'opération. Les valeurs possibles sont :
0 : ok,
-1 : la taille max de la chaîne alphanumérique devant recevoir le résultat est insuffisante,
-2 : erreur lors de la conversion,
-3 : la syntaxe du document JSON est invalide

Exemple :

 

alpha(3000) xml_string
alpha(2000) json_string
num_bin_2 codeRet
* Creation de l'objet JSON
* {"menu": {
* "id": "file",
* "value": "File",
* "popup": {
* "menuitem": [
* {"value": "New", "onclick": "CreateNewDoc()"},
* {"value": "Open", "onclick": "OpenDoc()"},
* {"value": "Close", "onclick": "CloseDoc()"}
* ]
* }
* }}
json_string = '{"menu": {"id": "file","value": "File","popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"},{"value": "Open", "onclick": "OpenDoc()"},{"value": "Close", "onclick": "CloseDoc()"}]}}}'
appeler_class 'sampleXMLJSONConverter' 'JSONStringtoXMLString' json_string xml_string 3000 codeRet
* Le resultat de la conversion dans xml_string est :
* <?xml version="1.0" encoding="UTF-8"?>
* <menu>
* <value>File</value>
* <id>file</id>
* <popup>
* <menuitem><value>New</value><onclick>CreateNewDoc()</onclick></menuitem>
* <menuitem><value>Open</value><onclick>OpenDoc()</onclick></menuitem>
* <menuitem><value>Close</value><onclick>CloseDoc()</onclick></menuitem>
* </popup>
* </menu>

 


- JSONStringtoXMLBlob : Conversion d'un objet JSON sous la forme d'une chaîne alphanumérique en document XML équivalent sous la forme d'un blob

Les paramètres :
ALPHA(...) jsonlDoc : objet JSON à convertir,
IMAGE xmlDoc : Blob devant recevoir le résultat de la conversion,
ALPHA(...) encoding : encodage utilisé pour la création du document XML sous la forme d'un blob
NUM_BIN_2 codeRet : Code retour de l'opération. Les valeurs possibles sont :
0 : ok,
-1 : erreur lors de la conversion,
-2 : La syntaxe du document JSON est invalide,
-3 : l'encodage utilisé pour la création du document XML n'est pas supporté.

Exemple :

 

image xml_blob
alpha(2000) json_string
num_bin_2 codeRet
* Creation de l'objet JSON
* {"menu": {
* "id": "file",
* "value": "File",
* "popup": {
* "menuitem": [
* {"value": "New", "onclick": "CreateNewDoc()"},
* {"value": "Open", "onclick": "OpenDoc()"},
* {"value": "Close", "onclick": "CloseDoc()"}
* ]
* }
* }}
json_string = '{"menu": {"id": "file","value": "File","popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"},{"value": "Open", "onclick": "OpenDoc()"},{"value": "Close", "onclick": "CloseDoc()"}]}}}'
appeler_class 'sampleXMLJSONConverter' 'JSONStringtoXMLBlob' json_string xml_blob 'ISO-8859-1' codeRet
* Le resultat de la conversion dans xml_blob est :
* <?xml version="1.0" encoding="ISO-8859-1"?>
* <menu>
* <value>File</value>
* <id>file</id>
* <popup>
* <menuitem><value>New</value><onclick>CreateNewDoc()</onclick></menuitem>
* <menuitem><value>Open</value><onclick>OpenDoc()</onclick></menuitem>
* <menuitem><value>Close</value><onclick>CloseDoc()</onclick></menuitem>
* </popup>
* </menu>

 

Manipulation coté navigateur

JSON est supporté nativement par les navigateurs récents :

IE 8 avec une page Web en mode IE 8 (<meta http-equiv="X-UA-Compatible" content="IE=8" /> dans le <head>),
Google Chrome 6
Opera 10.62
Firefox 3.6

L'objet window.JSON offre 2 méthodes :
window.JSON.parse : conversion d'une chaîne alphanumérique au format JSON en objet Javascript,
window.JSON.stringify : conversion un objet JavaScript en chaîne alphanumérique du format JSON

Quelques pointeurs :

http://msdn.microsoft.com/en-us/library/bb299886.aspx
https://developer.mozilla.org/En/Using_native_JSON
http://msdn.microsoft.com/en-us/library/cc836458(VS.85).aspx

Pour un support multi-navigateurs, l'utilisation d'une bibliothèque JavaScript est nécessaire.
Voir par exemple : http://www.json.org/js.html


Note : En Adelia, la taille maximum d'une variable ALPHA est 32767 caractères. Donc, pour palier à cette limite on pourrait créer une fonction XMLBlobtoJSONBlob.


Articles connexes

2 commentaires

  1. Utilisateur inconnu (jtraissard) dit :

    La nouvelle commande adelia CONV_DONNEES utilise t-elle la même technologie ? Faut il préférer une méthode à l'autre ?

  2. CONV_DONNEES est préférable, ne serait-ce que parce que la commande sera maintenue tandis que la solution de la fiche ne l'est pas et peut être amenée à disparaître si jamais on réorganise le fonctionnement du runtime différemment.