PBToolboxAI v4 ← Site

jsontree — u_pbt_jsontree #

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

jsontree affiche une valeur JSON comme un arbre repliable, coloré par type : un écran de configuration, une réponse d'API, un débogage d'intégration. Vous posez le texte JSON dans is_json, le composant le montre ; un clic sur un nœud rapporte son chemin (ue_node_clicked), un JSON invalide lève ue_error. Il ne modifie rien : c'est un VISUALISEUR.

▶ Le voir en vrai — Application de démonstration, tuile JSON tree, avec le code et cette page côte à côte.


En bref #

Userobjectu_pbt_jsontree
EntréeLe texte JSON, dans is_json (une chaîne)
Plier / déplierChaque conteneur par son marqueur + / − dans la marge des numéros, par son chemin (of_expand_path, of_collapse_path), ou tout d'un coup (of_expand_all, of_collapse_all)
RetourUn clic sur un nœud donne son chemin (ue_node_clicked), celui de n_pbt_json : lines/1/sku ; un JSON invalide lève ue_error
FidélitéChaque nombre et chaque clé s'affichent tels que reçus : un identifiant de 64 bits reste exact, 1.10 reste 1.10, une clé en double garde ses deux membres

Démarrage rapide #

// Show an API response as a tree
uo_json.is_json = inv_rest.of_response_text()

// Fold everything, then let the user open what interests them
uo_json.of_collapse_all()

// ue_node_clicked : the path of the node clicked ("lines/1/sku"), the path of
// n_pbt_json -> of_get_string(as_path) on the same text reads its value

Propriétés #

PropriétéTypeDéfautDescription
is_jsonstring""Le texte JSON à montrer. Un objet, un tableau, une valeur ; lu et affiché comme un arbre, chaque nombre et chaque clé tels que reçus. Vide efface l'arbre, sans erreur ; un JSON invalide lève ue_error et n'affiche rien. Se relit tel qu'il a été posé
ib_wrapbooleantrueLes lignes longues reviennent à la ligne (true, par défaut) ou restent sur une ligne avec une barre horizontale (false) — un rendu d'éditeur de code
ib_search_enabledbooleantrueCtrl+F dans l'arbre ouvre une zone de recherche — la même recherche que of_search : taper surligne, Entrée ou F3 suivant, Maj+Entrée ou Maj+F3 précédent, Échap ferme. false laisse le raccourci à une application qui cherche depuis sa propre zone. La zone porte deux bascules avant le compteur, Aa (ib_find_match_case) et ab (ib_find_whole_word) ; changer une option relance la recherche en cours depuis sa première occurrence
ib_find_match_casebooleanfalseOption de recherche : ne trouve que le texte de même casse. La bascule Aa de la zone de recherche (Ctrl+F) est le même interrupteur ; vaut pour of_search et pour ce que l'utilisateur tape. Lue en direct ; of_reset la remet à false
ib_find_whole_wordbooleanfalseOption de recherche : ne trouve le texte que comme mot entier (une lettre, un chiffre ou un _ à côté fait partie du mot : id n'est trouvé ni dans user_id ni dans ids). La bascule ab de la zone de recherche est le même interrupteur. Lue en direct ; of_reset la remet à false
is_theme_stylestring""Style visuel du composant (constantes THEME_STYLE_*) ; vide = celui de l'application, suivi à chaque changement
is_theme_modestring""Variante claire ou sombre (constantes THEME_MODE_*) ; vide = celle de l'application, suivie à chaque changement
il_theme_accentlong-1Couleur d'accent de ce composant (-1 = l'accent de l'application, ou celui du thème)
is_tooltipstring""Info-bulle simple affichée au survol du composant
is_super_tooltip_titlestring""Titre de l'info-bulle enrichie (prend le pas sur is_tooltip)
is_super_tooltip_textstring""Texte de l'info-bulle enrichie (balisage riche accepté)
is_super_tooltip_imagestring""Image de l'info-bulle enrichie

Méthodes #

MéthodeDescription
of_expand_all ( ) → longDéplie tous les conteneurs. Aucun ue_node_toggled : aucun geste n'ouvre l'arbre entier d'un coup. Rend 0, -2 si le composant n'est pas créé
of_collapse_all ( ) → longReplie tous les conteneurs imbriqués (le niveau du haut reste visible). Une sélection cachée par un pli passe sur le bloc replié, et ue_selection_changed le dit. Aucun ue_node_toggled : aucun geste ne replie l'arbre entier d'un coup. Rend 0, -2 si le composant n'est pas créé
of_expand_path ( string as_path ) → longOuvre UN bloc (objet ou tableau) par son chemin, et les blocs au-dessus de lui pour qu'il se voie. Comme son marqueur +, lève ue_node_toggled pour le bloc et pour chaque bloc replié au-dessus ouvert en chemin (rien pour un bloc déjà ouvert). Rend 0, -5 si aucun bloc n'a ce chemin (inconnu, ou une feuille), -2 si le composant n'est pas créé
of_collapse_path ( string as_path ) → longReplie UN bloc par son chemin. Comme son marqueur −, lève ue_node_toggled si le bloc était ouvert, et ue_selection_changed quand la sélection doit passer sur lui. Rend 0, -5 si aucun bloc n'a ce chemin (inconnu, ou une feuille), -2 si le composant n'est pas créé
of_is_expanded ( string as_path ) → booleantrue si le bloc de ce chemin est ouvert, lu EN DIRECT ; false s'il est replié, et pour une feuille ou un chemin inconnu. De quoi enregistrer ce que l'utilisateur a ouvert et le rétablir
of_copy ( ) → longMet la sélection dans le presse-papiers, comme Ctrl+C dans l'arbre : une feuille donne sa valeur DÉCODÉE (une chaîne sans guillemets ni échappements), un bloc son texte JSON indenté. Rend 0, -4 si rien n'est sélectionné, -2 si le composant n'est pas créé
of_clear ( ) → longVide l'arbre (comme is_json = "") ; ib_wrap, ib_search_enabled, ib_find_match_case et ib_find_whole_word gardent leur valeur (c'est of_reset qui remet tout). Rend 0, -2 si le composant n'est pas créé
of_expand_to_level ( long al_level ) → longMontre l'arbre jusqu'à al_level : les blocs à cette profondeur ou plus se replient (1 = les enfants directs du bloc racine, 0 replie la racine). Aucun ue_node_toggled ; une sélection qu'il déplace sur un bloc replié lève ue_selection_changed. Rend 0, -2 si le composant n'est pas créé
of_search ( string as_query ) → longSurligne chaque occurrence (sans casse par défaut — voir ib_find_match_case —, en mot entier avec ib_find_whole_word ; deux sur une ligne comptent deux) et saute à la première ; seuls les blocs qui cachent l'occurrence COURANTE s'ouvrent, et of_clear_search les replie. ue_search_result dit combien. La recherche porte sur le texte AFFICHÉ : un caractère échappé se cherche échappé (C:\\Temp). Une requête vide vaut of_clear_search. La zone de recherche s'ouvre avec la requête dedans et le focus dessus (la même que Ctrl+F) : Entrée passe à la suivante ; avec ib_search_enabled à false, l'arbre surligne seulement. Rend 0, ou un code négatif
of_search_next ( ) → longPasse à l'occurrence SUIVANTE (revient à la première après la dernière) ; ue_search_result donne la nouvelle position. Rend 0, ou un code négatif
of_search_prev ( ) → longPasse à l'occurrence PRÉCÉDENTE (revient à la dernière avant la première) ; ue_search_result donne la nouvelle position. Rend 0, ou un code négatif
of_clear_search ( ) → longEfface la recherche : plus de surlignage ni d'occurrence courante (of_match_count rend 0), la zone de recherche se vide et se ferme, et les blocs que la recherche avait ouverts se replient comme avant elle. Rend 0, ou un code négatif
of_select_path ( string as_path ) → longSélectionne et défile jusqu'au nœud à as_path ; comme le clavier, lève ue_selection_changed (rien si le nœud est déjà sélectionné) ; les blocs repliés qui le cachent s'ouvrent. as_path est un chemin de n_pbt_json (lines/1/sku, "" = la racine). Rend 0, -5 si aucun nœud n'a ce chemin (la sélection ne bouge pas), -2 si le composant n'est pas créé
of_selected_path ( ) → stringLe chemin du nœud sélectionné, lu EN DIRECT : celui de n_pbt_json, les niveaux joints par / et un indice de tableau compté à partir de 1 (lines/1/sku), à passer tel quel à of_get_string sur le même texte. Une clé vide ou qui contient / n'est pas adressable. "" est la racine, ou rien de sélectionné : of_has_selection les distingue
of_selected_value ( ) → stringLa valeur JSON de la ligne sélectionnée quand c'est une FEUILLE (une chaîne garde ses guillemets, prête à coller), lue EN DIRECT. Vide pour un conteneur ou sans sélection
of_selected_text ( ) → stringLa VALEUR de la feuille sélectionnée, décodée, lue EN DIRECT : une chaîne sans ses guillemets ni ses échappements, un nombre ou true/false/null tels qu'écrits. Vide pour un conteneur ou sans sélection
of_has_selection ( ) → booleantrue quand un nœud est sélectionné, lu EN DIRECT — la racine comprise, dont le chemin est ""
of_match_count ( ) → longRend le nombre d'OCCURRENCES de la recherche courante (deux sur une ligne comptent deux), lu EN DIRECT — le 12 d'une barre d'état 3 / 12. 0 sans recherche
of_match_index ( ) → longRend la position (1-basée) de la correspondance courante, lue EN DIRECT — le 3 d'une barre d'état 3 / 12. 0 sans correspondance

Événements #

ÉvénementQuand
ue_node_clicked (string as_path)L'utilisateur a cliqué un nœud, ou appuyé sur Entrée sur une feuille sélectionnée : son chemin, celui de n_pbt_json (lines/1/sku, "" pour la racine) — of_get_string(as_path) sur le même texte en lit la valeur. Entrée sur un bloc le plie, et n'atteint jamais le bouton par défaut de la fenêtre
ue_node_toggled (string as_path, boolean ab_expanded)Un bloc a été replié (ab_expanded à false) ou ouvert (true) : par l'utilisateur (son marqueur + / −, les flèches, Entrée ou Espace) ou par of_expand_path / of_collapse_path. of_expand_all, of_collapse_all et of_expand_to_level ne le lèvent pas : aucun geste ne replie l'arbre entier
ue_selection_changed (string as_path)La sélection a bougé sans clic, par l'utilisateur ou par votre code : flèches, Début/Fin, Page préc./suiv., of_select_path, ou un pli qui cache la ligne sélectionnée (la sélection passe alors sur le bloc replié) — un clic souris rapporte ue_node_clicked
ue_search_result (long al_count, long al_index)Une recherche a démarré ou avancé : al_count occurrences en tout, la courante est al_index (1-basé, 0 si aucune) — de quoi afficher « 3 / 12 »
ue_error (string as_message)Le texte de is_json n'est pas un JSON valide : le message dit pourquoi, avec la ligne et la colonne, dans la langue d'affichage ; l'arbre reste vide. Levé aussi pour un document trop grand pour être montré (plus de 1 500 000 lignes)

Exemple #

Explorer la réponse d'une API #

// Fetch the order : the tree shows the response, or empties on a failure
if inv_rest.of_get(/*url*/ "https://api.example.com/orders/4152") = 200 then
	uo_json.is_json = inv_rest.of_response_text()
	uo_json.of_collapse_all()          // the reader opens what interests them
else
	uo_json.of_clear()
end if

Lire la valeur d'un nœud cliqué #

// ue_node_clicked of uo_json : the path is the one n_pbt_json reads
n_pbt_json lnv_json

// Read the value at the clicked path with n_pbt_json
lnv_json.of_load(/*json*/ uo_json.is_json)
st_value.text = lnv_json.of_get_string(/*path*/ as_path)

// or, without a second parser : the value of the selected leaf, decoded
st_value.text = uo_json.of_selected_text()

Chercher des mots entiers, casse comprise #

// Whole words only, with the same case : "id" is not found inside "user_id"
uo_json.ib_find_match_case = true
uo_json.ib_find_whole_word = true
uo_json.of_search(/*query*/ "id")

Bonnes pratiques #


Hérité du socle commun #

Ces membres existent sur tous les composants visuels — ils ne sont pas propres à celui-ci. Ils sont détaillés une seule fois, dans les chapitres transverses ; cette table dit seulement où les lire.

MembresRôleDétaillé dans
of_resetRemettre le composant à zéro3.6 Remettre un composant à zéro : of_reset()
of_register_shortcut · of_clear_shortcutsRaccourcis clavier du composant3.5 Les raccourcis clavier
of_is_created · of_is_ready · of_get_last_errorS'il est né, s'il est prêt, ce qui a échoué3.7 Diagnostic
of_save_as_png · of_save_as_jpgExporter le rendu en image3.8 Exporter le rendu en image
of_set_redrawGrouper les modifications en un seul repaint3.10 Bonnes pratiques
of_preload_iconsIcônes affichées sans délaiAffichage instantané : of_icon
of_set_translationTraduire un libellé du composant5.2 Adapter un libellé : of_set_translation
of_focus_webviewDonner le focus au composant6.4 Clavier et focus
of_print · of_print_to_pdfImprimer, ou écrire un PDF6.9 Imprimer
of_set_property · of_get_property · of_component_namePiloter une propriété par son nom3.1 Le moteur de propriétés

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