Intégration JSON à IBM i.


Projet YAJL


Scott Klement (l'auteur du projet JDBCR4) propose l'Implémentation du projet Open Source YAJL (écrit en C) sur IBM i


   Yet Another JSON Library

Ainsi qu'un programme de service qui sert de passerelle, écrit en RPG pour RPG : YAJLR4

JSON (JavaScript Object Notation) est un format de données textuelles dérivé de la notation des objets du langage JavaScript (Wikipedia)

 

ce qui s'écrit comme cela en XML   s'écrit comme cela en JSON
<producteurs>
  <producteur>
    <numero>45</numero>
   <commune>Reims</commune>
    <appellation>13</appellation>
  </producteur>
</producteurs>
->

{
   "producteurs":  {
       "producteur": {
            "numero":45,
            "commune":"Reims",
            "appellation":13
       }
    }
}


Un élément peut contenir un objet, une valeur ou un tableau de valeurs, marqué alors par [ et ]

<PO>
 <id>103</id>
<orderDate>2014-06-20</orderDate>
<customer>
<cid>888</cid>
</customer> <items>
<item>
<partNum>872-AA</partNum>
<shipDate>2014-06-21</shipDate>
<productName>Lawnmower</productName>
<USPrice>749.99</USPrice>
<quantity>1</quantity>
</item>
<item>
<partNum>837-CM</partNum>
<productName>Digital Camera</productName>
<USPrice>199.99</USPrice>
<quantity>2</quantity>
<comment>2014-06-22</comment>
</item>
</items>
</PO>

devient (remarquez le tableau de "item")

{
 "PO":{
 "id": 103, 
 "orderDate": "2014-06-20", 
 "customer": {"@cid": 888}, 
 "items": { 
   "item": [
             { "partNum": "872-AA", 
               "productName": "Lawnmower", 
               "quantity": 1, 
               "USPrice": 749.99, 
               "shipDate": "2014-06-21" 
             }, 
             { "partNum": "837-CM", 
               "productName": "Digital Camera", 
               "quantity": 2, 
               "USPrice": 199.99, 
               "comment": "2014-06-22" 
             } 
          ] 
        } 
    }
}


Il y a trois manières officielles d'utiliser JSON sur IBM i :


YAJL propose une quatrième solution permettant un accès en RPG

Installation

Commencez par aller chercher le SAVF sur le site https://www.scottklement.com/yajl/


Créez une bibliothèque (Scott propose YAJLLIB) et restaurez par :

    RSTOBJ OBJ(*ALL) SAVLIB(QTEMP) DEV(*SAVF) SAVF(<bib-savf>/YAJLLIB) RSTLIB(<bib-objet>)

Vérifiez que le répertoire de liage YAJL contient bien les deux programmes de services livrés

  WRKBNDDIRE YAJL, puis option 9
   

   

Utilisation


Vos sources doivent commencer par

    H DFTACTGRP(*NO) ACTGRP('xxxx') BNDDIR('YAJLLIB/YAJL')
ou
  ctl-opt DFTACTGRP(*NO) ACTGRP('xxxx') BNDDIR('YAJLLIB/YAJL');

puis

    /include yajl_h

Création d'un document

Exemple Complet

Partie déclaration (full Free RPG)



Structure générale du programme S/PGM (contient la API YAJL)


Résultat

Avec Eclipse


Vous trouverez également des plugins plus intelligents (ici JSON Tools)

Lecture d'un document


Exemple Complet

Partie déclaration (toujours full Free RPG)



Structure générale du programme


Boucle de lecture du tableau

Une fois la donnée lue, vous pouvez en faire ce que vous voulez (écriture, affichage, impression).


Pour un traitement du format XML par RPG, particulièrement le code opération XML-INTO, voyez ce cours

 

puis, en Mai 2018, IBM propose un code opération Data-Into permettant de parser n'importe quel format de données, à condition d'écrire le parser

 

Le produit YAJL s'adapte et propose un parser YAJLINTO pour ce code-opération

Soit le fichier suivant :

 

Le RPG suivant appelle le Parser

Remarquez count automatiquement renseigné dans la PSDS quand on alimente directement un tableau


Résultat

 

Vous pouvez mettre des options au parser