json — n_pbt_json #
← Référence des composants · Sommaire du guide
Construire un JSON type par type — texte, nombre, booléen, tableau, objet imbriqué — avec l'échappement fait pour vous, puis en relire un le long d'un chemin :
of_load,of_get_string,of_type,of_count. Un seul objet bâtit vos requêtes et lit vos réponses. Tout en PowerScript pur : aucune page, aucun moteur, PowerBuilder 10 compris.
▶ Le voir en vrai — Application de démonstration, tuile JSON : les résultats, le code qui les produit et cette page, côte à côte.
En bref #
n_pbt_json est autoinstantiate : on le déclare en variable locale, sans create ni destroy. C'est le même objet qui sert, en interne, à bâtir les charges utiles envoyées au moteur — désormais offert à votre code, côté construction et lecture.
Démarrage rapide #
Bâtir une charge utile, puis relire une réponse — tout tient dans une variable locale :
// Local variables
n_pbt_json lnv_json
string ls_customer
double ld_total
// Write : each member is typed and escaped for you - a path may have levels
lnv_json.of_set_string(/*path*/ "customer", /*value*/ "Ada")
lnv_json.of_set_number(/*path*/ "total", /*value*/ 690.50)
lnv_json.of_set_boolean(/*path*/ "paid", /*value*/ true)
// lnv_json.of_text() -> {"customer":"Ada","total":690.5,"paid":true}
// Read : load a response, reach values by path
lnv_json.of_load(/*json*/ '{"order":{"customer":"Ada","total":690.50}}')
IF lnv_json.of_is_valid() THEN
ls_customer = lnv_json.of_get_string(/*path*/ "order/customer") // Ada
ld_total = lnv_json.of_get_number(/*path*/ "order/total") // 690.5
END IF
Un chemin est la suite des clés depuis la racine, jointes par / ; l'index d'un tableau est sa position, comptée à partir de 1, comme toute position de la bibliothèque : order/lines/1 est la première ligne, order/lines/0 ne désigne rien. Un segment vide (a//b, /a) ou un index 0 sur un tableau ne désigne rien — une écriture le refuse par -5 — et une clé qui contient / n'est pas adressable. Si un objet écrit la même clé deux fois, c'est sa PREMIÈRE occurrence qui est lue et écrite — un navigateur, lui, retient la dernière.
Construire une charge utile #
| Méthode | Rôle |
|---|---|
of_add_string (string as_path, string as_value) → long | Ajoute une CHAÎNE, échappée pour vous, au TABLEAU situé à as_path. Le tableau doit exister : ouvrez-le d'abord avec of_set_raw et un tableau vide. Rend 0, -4 si as_path est absent ou n'est pas un tableau, -5 si un segment de as_path est vide ou est un index 0 sur un tableau ; une chaîne nulle s'écrit vide (pour un null JSON : of_add_raw(as_path, "null")) |
of_add_boolean (string as_path, boolean ab_value) → long | Ajoute un BOOLÉEN (true ou false, jamais entre guillemets) au TABLEAU situé à as_path. Le tableau doit exister : ouvrez-le d'abord avec of_set_raw et un tableau vide. Rend 0, -4 si as_path est absent ou n'est pas un tableau, -5 si un segment de as_path est vide ou est un index 0 sur un tableau; une valeur nulle écrit null |
of_add_number (string as_path, long al_value) → long | Ajoute un NOMBRE (cinq surcharges : integer, long, longlong, decimal, double — un decimal et un longlong gardent TOUS leurs chiffres (les centimes d'un montant, le dernier chiffre d'un identifiant au-delà de 2^53), et un littéral comme 690.50 est un decimal, écrit 690.5) au TABLEAU situé à as_path. Le tableau doit exister : ouvrez-le d'abord avec of_set_raw et un tableau vide. Rend 0, -4 si as_path est absent ou n'est pas un tableau, -5 si un segment de as_path est vide ou est un index 0 sur un tableau; une valeur nulle écrit null |
of_add_raw (string as_path, string as_json) → long | Ajoute une valeur DÉJÀ en JSON (un objet, un tableau) dont vous répondez au TABLEAU situé à as_path. Le tableau doit exister : ouvrez-le d'abord avec of_set_raw et un tableau vide. Rend 0, -4 si as_path est absent ou n'est pas un tableau, -5 si un segment de as_path est vide ou est un index 0 sur un tableau; une valeur nulle ou vide écrit null. Le chemin vide est la RACINE : of_load("[]") puis of_add_raw("", …) bâtit un document qui est un tableau (le corps d'un appel d'API groupé). Ajouter beaucoup d'éléments d'affilée au même tableau reste rapide |
of_set_array (string as_path, string as_values[]) → long | ÉCRIT un TABLEAU entier de chaînes à as_path depuis un tableau PowerBuilder, chaque élément échappé. Un tableau vide en écrit un vide, un élément nul une chaîne vide. Même règle de chemin et mêmes codes que of_set_string |
of_set_members (string as_fragment) → long | Fusionne à la RACINE des membres déjà formés ailleurs, joints par des virgules. Un fragment vide n'écrit rien. Rend 0, -4 si la racine du document n'est pas un objet |
of_clear ( ) → long | Vide le document pour recommencer un autre objet avec la même variable. Rend 0 |
of_text ( ) → string | Le document tel quel (compact) : ce que vous avez bâti (of_add_string, of_add_number...) ou chargé (of_load), après toute modification — la sortie unique, prête à envoyer, stocker ou réécrire. of_pretty en donne la forme indentée. {} si vide ; l'appeler ne vide rien |
Lire un document #
| Méthode | Rôle |
|---|---|
of_load (string as_json) → long | Charge un texte JSON pour la lecture. Rend 0 s'il est bien formé, -5 si l'argument est vide ou blanc (espaces, tabulations, fins de ligne), -4 s'il n'est pas du JSON valide ou imbrique plus de 512 niveaux (le document est alors abandonné). Analyse en PowerScript pur. Un BOM (U+FEFF) en tête, celui d'un fichier enregistré en UTF-8 avec BOM, est ignoré |
of_is_valid ( ) → boolean | Vrai quand l'objet tient un document : le dernier of_load a réussi, ou quelque chose a été écrit depuis. Une valeur passée à of_set_raw / of_add_raw n'est pas revérifiée |
of_exists (string as_path) → boolean | Vrai quand une valeur existe au chemin donné — distingue une valeur présente mais vide d'une valeur absente |
of_type (string as_path) → string | Le type JSON au chemin : object, array, string, number, boolean, null ; vide si absent |
of_get_string (string as_path) → string | La valeur au chemin, en texte : une chaîne décodée, un nombre/booléen/null en texte, un objet ou tableau en JSON brut (rechargeable par of_load) ; une clé écrite deux fois est lue à sa PREMIÈRE occurrence |
of_get_number (string as_path) → double | Le nombre au chemin, en double — le point décimal est honoré sur toute machine (2.5 vaut 2,5, pas 2). 0 si absent; l'exposant est résolu (1e-7, 2.5E+3) et 17 chiffres significatifs sont gardés, zéros de tête de l'exposant compris. Pour un montant ou un identifiant qui doit garder tous ses chiffres : of_get_decimal ou of_get_longlong |
of_get_decimal (string as_path) → decimal | Le nombre au chemin, en decimal, rebâti depuis le TEXTE du nombre et jamais par un double : 12345678901234.56 revient avec ses centimes, 2.5E-3 vaut 0.0025. 28 chiffres significatifs au plus. 0 si absent, si la valeur n'est pas un nombre, ou au-delà de ce que tient un decimal |
of_get_longlong (string as_path) → longlong | Le nombre au chemin, en entier 64 bits, rebâti depuis son texte et jamais par un double : un identifiant de base comme 9007199254740993 revient entier. Les décimales sont coupées (2.9 donne 2). 0 si absent, si la valeur n'est pas un nombre, ou hors de la plage d'un longlong |
of_get_boolean (string as_path) → boolean | Le booléen au chemin : vrai seulement pour le littéral JSON true |
of_count (string as_path) → long | Le nombre de membres de l'objet, ou d'éléments du tableau, au chemin. Rend -1 si la valeur est scalaire ou absente (distingue un tableau vide, 0, d'un absent, -1). Avec of_name, on parcourt un objet ; un tableau se parcourt par son index dans le chemin (rows/1, rows/2…) |
of_name (string as_path, long al_index) → string | Le nom du membre n° al_index (à partir de 1) de l'objet au chemin — pour lire les clés d'un objet dont on ignore la forme. Avec of_count, on parcourt l'objet |
of_get_array (string as_path, ref string as_values[]) → long | Tous les éléments du tableau au chemin, dans l'ordre, dans as_values (vidé d'abord) — chacun comme of_get_string le lit : une chaîne décodée, un nombre ou un booléen en texte, null en "", un objet ou un tableau en JSON brut (à recharger par of_load dans un autre n_pbt_json). "" désigne la racine. Rend le nombre d'éléments (0 pour un tableau vide), -4 quand il n'y a pas de tableau à ce chemin (rien, un objet, un scalaire), -5 sur un segment vide (a//b) |
of_pretty ( ) → string | Le document — chargé ou bâti — ré-indenté pour la lecture (plusieurs lignes, tabulations) — un log, une zone de texte. Vide s'il n'y en a pas |
of_pretty (long al_indent) → string | Le document — chargé ou bâti — ré-indenté avec al_indent espaces par niveau (2 et 4 sont les largeurs usuelles). 0 l'écrit compact, sur une ligne et sans espace : le plus petit texte à stocker ou à envoyer. Vide s'il n'y a pas de document, ou si al_indent est négatif, supérieur à 16 ou null. of_pretty() sans argument garde les tabulations |
// Local variables
n_pbt_json lnv_json
string ls_tags[]
string ls_compact
long ll_count
// Read every element of an array at once, then store the document on one line
lnv_json.of_load(/*json*/ '{"customer":{"name":"Ada","tags":["vip","b2b"]}}')
ll_count = lnv_json.of_get_array(/*path*/ "customer/tags", /*values*/ ls_tags) // 2 : vip, b2b
// The document on one line, without a space : the smallest text to store
ls_compact = lnv_json.of_pretty(/*indent*/ 0)
Modifier un document #
Le côté écriture change le document chargé sur place, puis of_text en rend le résultat (compact) — ce qu'on réécrit. Les setters remplacent la valeur au chemin, ou ajoutent la dernière clé quand elle manque à un objet parent. Chacun rend 0, -4 quand le parent manque ou n'est pas du bon type, -5 sur un chemin vide ou un index 0 sur un tableau. Un tableau rencontré en chemin se traverse par un index qui EXISTE (items/1/qty ajoute qty au premier élément) ; seule une clé d'objet est jamais créée. Une valeur null (nombre, booléen, JSON brut vide) s'écrit null.
| Membre | Rôle |
|---|---|
of_set_string (string as_path, string as_value) → long | ÉCRIT une chaîne à as_path, échappée pour vous. Le chemin peut avoir PLUSIEURS niveaux (a/b/c) : les niveaux absents sont créés en OBJETS, et un document VIDE en devient un — écrire, c'est bâtir. Une valeur déjà là est remplacée, où qu'elle soit. Rend 0, -4 si un niveau du chemin est un scalaire, ou un tableau sans cet index (un tableau se traverse par un index existant : items/1/qty), -5 sur un chemin vide, un segment vide ou un index 0 sur un tableau. Une chaîne nulle s'écrit vide ; pour un null JSON : of_set_raw(as_path, "null") |
of_set_number (string as_path, long al_value) → long | ÉCRIT un NOMBRE à as_path, le point décimal forcé quelle que soit la région. Cinq surcharges : integer, long, longlong, decimal, double — un decimal et un longlong gardent TOUS leurs chiffres (les centimes d'un montant, le dernier chiffre d'un identifiant au-delà de 2^53), et un littéral comme 690.50 est un decimal, écrit 690.5. Même règle de chemin et mêmes codes que of_set_string; une valeur nulle écrit null |
of_set_boolean (string as_path, boolean ab_value) → long | ÉCRIT un BOOLÉEN à as_path : true ou false, jamais entre guillemets. Même règle de chemin et mêmes codes que of_set_string; une valeur nulle écrit null |
of_set_raw (string as_path, string as_json) → long | ÉCRIT à as_path une valeur DÉJÀ en JSON — un objet imbriqué, un tableau, null — telle quelle : vous en répondez. C'est aussi ainsi qu'on OUVRE un tableau avant of_add_*. Même règle de chemin et mêmes codes que of_set_string; une valeur nulle ou vide écrit null |
of_remove (string as_path) → long | Retire la valeur au chemin — un membre d'objet (sa clé et une virgule partent avec) ou un élément de tableau ; le résultat reste valide. Rend 0, -4 si rien n'est là, -5 sur un chemin vide, un segment vide ou un index 0 sur un tableau |
// Local variables
n_pbt_json lnv_json
// Load, edit in place, then read back the ONE document with of_text
lnv_json.of_load(/*json*/ '{"name":"Ada","active":false}')
lnv_json.of_set_string(/*path*/ "name", /*value*/ "Grace") // replace
lnv_json.of_set_boolean(/*path*/ "active", /*value*/ true)
lnv_json.of_set_number(/*path*/ "count", /*value*/ 3) // added : the key was absent
// lnv_json.of_text() -> {"name":"Grace","active":true,"count":3}
Portée. JSON s'analyse en PowerScript pur, sans page ni moteur :
n_pbt_jsonreste autoinstantiate et fonctionne partout, PowerBuilder 10 compris. Pour du XML, voyez xml (qui s'appuie sur le moteur) ; pour afficher un JSON en arbre repliable, voyez jsontree.