Aller au contenu

%PARSER

Analyseur de DATA-INTO

Indique le programme ou la procédure qui lit le document dans un DATA-INTO, et lui transmet éventuellement des options sous forme de texte.

Syntaxe

%PARSER(analyseur)
%PARSER(analyseur : options-de-l-analyseur)
analyseur
Le nom du programme (éventuellement qualifié par sa bibliothèque, comme 'YAJLLIB/YAJLINTO') ou un pointeur de procédure.
options-de-l-analyseur
Un texte transmis tel quel à l'analyseur. Pour YAJLINTO, c'est un objet JSON : value_true, value_false, value_null, skip_nulls, document_name…
Résultat
%PARSER ne renvoie rien : elle complète DATA-INTO, qui exige toujours un analyseur.

À quoi ça sert

Le RPG sait faire correspondre un document à une structure de données, mais pas lire les formats eux-mêmes. L'analyseur est un petit programme qui parcourt le document et renvoie au compilateur les noms et les valeurs. %PARSER permet de choisir celui qu'on veut et de le régler.

Avec YAJLINTO, les options servent à décider comment traduire les booléens et les valeurs null du JSON, en zones caractère par exemple.

Exemple 1 : Traduire les booléens et les null

**free
// %PARSER : choisir l'analyseur de DATA-INTO et lui passer des options (ici YAJLINTO).
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-pr qcmdexc extpgm('QCMDEXC');
  commande char(200) const;
  longueur packed(15:5) const;
end-pr;

dcl-ds client qualified;
  nom    varchar(30);
  actif  char(1);
  vip    char(1);
  tel    varchar(10) inz('aucun');
end-ds;

dcl-s json varchar(200);
dcl-s cmd  char(200);

monitor;
  cmd = 'ADDLIBLE YAJLLIB';
  qcmdexc(cmd : %len(%trim(cmd)));
on-error;
endmon;

json = '{"nom":"Dupont SA","actif":true,"vip":false,"tel":null}';

// 1) Sans option pour l'analyseur : vrai = 1, faux = 0, null = *NULL
data-into client %data(json : 'case=any') %parser('YAJLLIB/YAJLINTO');
snd-msg 'Nom        : [' + client.nom + ']';
snd-msg 'Defaut     : actif=[' + client.actif + '] vip=[' + client.vip
        + '] tel=[' + client.tel + ']';

// 2) Options de l'analyseur : le deuxieme parametre de %PARSER est un texte JSON
clear client;
client.tel = 'aucun';
data-into client %data(json : 'case=any allowmissing=yes')
  %parser('YAJLLIB/YAJLINTO' : '{"value_true":"O","value_false":"N","skip_nulls":true}');
snd-msg 'Avec options: actif=[' + client.actif + '] vip=[' + client.vip
        + '] tel=[' + client.tel + ']';

// 3) skip_nulls supprime la cle "tel" : sans allowmissing, DATA-INTO refuse le document
clear client;
monitor;
  data-into client %data(json : 'case=any')
    %parser('YAJLLIB/YAJLINTO' : '{"skip_nulls":true}');
  snd-msg 'skip_nulls seul : ok';
on-error;
  snd-msg 'skip_nulls seul : erreur, statut ' + %char(%status);
endmon;

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Nom        : [Dupont SA]
Defaut     : actif=[1] vip=[0] tel=[*NULL]
Avec options: actif=[O] vip=[N] tel=[aucun]
skip_nulls seul : erreur, statut 356

Sans option, un JSON true donne 1, false donne 0 et null donne le texte *NULL. Avec le deuxième paramètre de %PARSER, value_true et value_false fixent le texte à mettre dans les zones (ici O et N), et skip_nulls laisse de côté les valeurs null : la zone tel garde alors sa valeur d'avant, 'aucun'.

Dernier essai : skip_nulls supprime la clé, et sans allowmissing=yes dans %DATA, DATA-INTO échoue (statut 356).

Le piège

Les options de l'analyseur et celles de %DATA sont deux choses distinctes. skip_nulls est une option de l'analyseur ; elle fait disparaître la clé aux yeux du compilateur, qui la juge alors manquante. Il faut ajouter allowmissing=yes à %DATA, sinon l'erreur de statut 356 (RNX0356, code raison 4) survient.

Et sans option de l'analyseur, un null JSON se retrouve dans la zone sous la forme du texte *NULL, comme la ligne « Defaut » de l'exemple le montre.