PBToolboxAI v4 ← Site

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éthodeRôle
of_add_string (string as_path, string as_value) → longAjoute 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) → longAjoute 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) → longAjoute 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) → longAjoute 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) → longFusionne à 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 ( ) → longVide le document pour recommencer un autre objet avec la même variable. Rend 0
of_text ( ) → stringLe 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éthodeRôle
of_load (string as_json) → longCharge 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 ( ) → booleanVrai 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) → booleanVrai quand une valeur existe au chemin donné — distingue une valeur présente mais vide d'une valeur absente
of_type (string as_path) → stringLe type JSON au chemin : object, array, string, number, boolean, null ; vide si absent
of_get_string (string as_path) → stringLa 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) → doubleLe 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) → decimalLe 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) → longlongLe 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) → booleanLe booléen au chemin : vrai seulement pour le littéral JSON true
of_count (string as_path) → longLe 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) → stringLe 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[]) → longTous 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 ( ) → stringLe 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) → stringLe 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.

MembreRô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) → longRetire 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_json reste 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.

← Référence des composants · Sommaire du guide