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èveue_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 #
| Userobject | u_pbt_jsontree |
| Entrée | Le texte JSON, dans is_json (une chaîne) |
| Plier / déplier | Chaque 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) |
| Retour | Un 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é | Type | Défaut | Description |
|---|---|---|---|
is_json | string | "" | 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_wrap | boolean | true | Les 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_enabled | boolean | true | Ctrl+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 trois bascules avant le compteur, Aa (ib_find_match_case), ab (ib_find_whole_word) et & (ib_find_decoded) ; changer une option relance la recherche en cours depuis sa première occurrence |
ib_find_match_case | boolean | false | Option 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_word | boolean | false | Option 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 |
ib_find_decoded | boolean | false | Option de recherche : cherche dans les VALEURS décodées — une clé et une chaîne lues comme n_pbt_json les lit (say "hi" trouve les guillemets échappés, une lettre accentuée son échappement \u, un retour à la ligne son \n) ; le surlignage couvre l'échappement entier, un nombre et la ponctuation restent tels qu'affichés. false cherche le texte tel qu'il est affiché. La bascule & de la zone de recherche est le même interrupteur. Lue en direct ; of_reset la remet à false |
is_theme_style | string | "" | Style visuel du composant (constantes THEME_STYLE_*) ; vide = celui de l'application, suivi à chaque changement |
is_theme_mode | string | "" | Variante claire ou sombre (constantes THEME_MODE_*) ; vide = celle de l'application, suivie à chaque changement |
il_theme_accent | long | -1 | Couleur d'accent de ce composant (-1 = l'accent de l'application, ou celui du thème) |
is_tooltip | string | "" | Info-bulle simple affichée au survol du composant |
is_super_tooltip_title | string | "" | Titre de l'info-bulle enrichie (prend le pas sur is_tooltip) |
is_super_tooltip_text | string | "" | Texte de l'info-bulle enrichie (balisage riche accepté) |
is_super_tooltip_image | string | "" | Image de l'info-bulle enrichie |
Méthodes #
| Méthode | Description |
|---|---|
of_expand_all ( ) → long | Dé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 ( ) → long | Replie 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 ) → long | Ouvre 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, une feuille, ou un bloc vide {} / []), -2 si le composant n'est pas créé |
of_collapse_path ( string as_path ) → long | Replie 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, une feuille, ou un bloc vide {} / []), -2 si le composant n'est pas créé |
of_is_expanded ( string as_path ) → boolean | true si le bloc de ce chemin est ouvert, lu EN DIRECT ; false s'il est replié, et pour une feuille ou un chemin inconnu. L'état de tous les blocs d'un coup, pour l'enregistrer et le rétablir : of_get_layout |
of_get_layout ( ) → string | La disposition de l'arbre, lue EN DIRECT, en un texte JSON à enregistrer : les blocs repliés (collapsed, ou expanded quand cette liste est plus courte — tout bloc qu'elle ne nomme pas est alors replié), le chemin sélectionné (selected, null sans sélection) et la ligne en haut de la vue (top, un chemin, jamais des pixels). À rendre à of_set_layout, après un nouveau document aussi |
of_set_layout ( string as_layout_json ) → long | Rend à l'arbre une disposition donnée par of_get_layout : les plis (un chemin que le document n'a plus est ignoré, un bloc nouveau garde son défaut), la sélection (ue_selection_changed, comme of_select_path) et la ligne du haut. ue_layout_changed suit une fois si les plis ont changé. Rend 0, -5 si le texte n'est pas un objet JSON, -2 si le composant n'est pas créé |
of_copy ( ) → long | Met 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é ; un morceau de texte surligné à la souris est copié tel quel par Ctrl+C. Rend 0, -4 si rien n'est sélectionné, -2 si le composant n'est pas créé |
of_copy_path ( ) → long | Met le CHEMIN du nœud sélectionné dans le presse-papiers (team/1/name, "" pour la racine), prêt pour n_pbt_json. Rend 0, -4 si rien n'est sélectionné ou si le chemin lit un autre nœud (of_selected_addressable à false), -2 si le composant n'est pas créé |
of_clear ( ) → long | Vide 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 ) → long | Montre 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 ) → long | Surligne 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) — avec ib_find_decoded, dans les valeurs décodées. 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 ( ) → long | Passe à 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 ( ) → long | Passe à 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 ( ) → long | Efface 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 ) → long | Sé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 ( ) → string | Le 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. Un / ou un ~ d'une clé s'écrit ~1 ou ~0, comme en JSON Pointer : application~1json est la clé application/json. of_selected_addressable dit false pour le rare nœud dont le chemin en lit un autre. "" est la racine, ou rien de sélectionné : of_has_selection les distingue |
of_selected_value ( ) → string | La 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 ( ) → string | La 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 ( ) → boolean | true quand un nœud est sélectionné, lu EN DIRECT — la racine comprise, dont le chemin est "" |
of_selected_addressable ( ) → boolean | true quand le chemin du nœud sélectionné, donné à n_pbt_json sur le même document, lit CE nœud — lu EN DIRECT. false sans sélection, et sous la SECONDE de deux clés identiques (son chemin lit la première). Une clé VIDE est un niveau vide du chemin (a//b, / pour celle de la racine) : elle est adressable |
of_selected_type ( ) → string | Le type JSON du nœud sélectionné, dans les mots de n_pbt_json.of_type : object, array, string, number, boolean ou null — lu EN DIRECT. "" sans sélection |
of_selected_count ( ) → long | Le nombre de membres (un objet) ou d'éléments (un tableau) du nœud sélectionné, comme n_pbt_json.of_count les compte — lu EN DIRECT. -1 pour une valeur qui n'est pas un bloc, ou sans sélection, -2 si le composant n'est pas créé |
of_match_count ( ) → long | Rend 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 ( ) → long | Rend 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énement | Quand |
|---|---|
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, un / ou un ~ d'une clé écrit ~1 ou ~0) — 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_rclicked (string as_path, long al_x, long al_y) | Clic droit sur un nœud, ou touche Menu (Maj+F10) dans l'arbre : le nœud est d'abord sélectionné (ue_selection_changed si la sélection a bougé), as_path est son chemin, al_x / al_y le point à l'ÉCRAN, en pixels. Ouvrez-y votre propre menu (un u_pbt_contextmenu) : l'arbre n'en a pas |
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_layout_changed (string as_layout_json) | Les plis ont changé — un geste, un ordre de votre code (of_collapse_all compris), un nouveau document, of_set_layout : as_layout_json est la disposition entière, comme of_get_layout la donne, à enregistrer. Un changement de sélection ou de défilement ne le lève pas |
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 » ; quand une recherche se ferme (Échap dans la zone, of_clear_search, of_reset, ib_search_enabled = false), (0, 0) une fois |
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é #
// Instance variable of the window : the response, parsed ONCE by n_pbt_json
n_pbt_json inv_doc
// When the response arrives : the tree shows it, n_pbt_json parses the same text once
uo_json.is_json = inv_rest.of_response_text()
inv_doc.of_load(/*json*/ inv_rest.of_response_text())
// ue_node_clicked of uo_json : the value at the clicked path, nothing parsed again
st_value.text = inv_doc.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")
Garder les plis quand la réponse est rafraîchie #
// Local variables
string ls_layout
// The folds, the selected node and the line at the top, kept before the new text
ls_layout = uo_json.of_get_layout()
uo_json.is_json = inv_rest.of_response_text()
// The same blocks fold again ; a path the new text no longer has is ignored
uo_json.of_set_layout(/*layout_json*/ ls_layout)
Un menu sur un nœud #
// ue_node_rclicked of uo_json : the node is selected, open YOUR menu at that point of the screen
uo_menu.of_show(/*x*/ al_x, /*y*/ al_y)
// ue_item_selected of uo_menu : copy the value, or the path for n_pbt_json
choose case as_keys
case "copy"
uo_json.of_copy()
case "copypath"
uo_json.of_copy_path()
end choose
Bonnes pratiques #
- C'est un visualiseur, pas un éditeur : il montre le JSON, il ne le change pas. Pour lire une valeur, donnez le chemin de
ue_node_clickedàn_pbt_json.of_get_stringsur le même texte, ou lisezof_selected_text. - Un gros JSON reste fluide : seules les lignes à l'écran sont dessinées, une réponse de plusieurs centaines de Ko se parcourt au clavier sans attente.
of_collapse_alld'abord reste le plus lisible. - Un JSON invalide ne casse rien :
ue_errorle dit (avec la ligne et la colonne de la faute), l'arbre reste vide. C'est le retour à montrer, pas un plantage. - Toute clé a un chemin : un
/ou un~s'y écrit~1ou~0(JSON Pointer), etn_pbt_jsonle lit ainsi —paths/~1users~1{id}pour une spécification OpenAPI. Une clé VIDE est un niveau vide (a//b,/pour celle de la racine). Une exception, queof_selected_addressablesignale : ce qui est sous la seconde de deux clés identiques (le chemin désigne la première). - De droite à gauche : un document JSON est un texte de gauche à droite, l'arbre le reste dans une application en RTL (seule la zone de recherche suit le sens de l'application).
- Le clavier reste à l'arbre : Entrée plie un bloc ou « clique » une feuille (
ue_node_clicked), jamais le bouton par défaut de la fenêtre ; Échap ferme d'abord la zone de recherche ouverte, puis revient à la fenêtre ; les lignes fermantes (},]) ne sont pas des positions de la sélection ; Ctrl+C copie la sélection (of_copy), ou le morceau de texte surligné à la souris ; Espace plie un bloc et ne fait jamais défiler la vue ; la touche Menu (Maj+F10) lèveue_node_rclicked. - Très gros documents : au-delà de 1 500 000 lignes, le document est refusé avec
ue_errorplutôt que tronqué sans le dire. L'impression (of_print,of_print_to_pdf) sort ce qui est déplié, jusqu'à 10 000 lignes : un bloc replié s'imprime replié (of_expand_allavant, pour tout imprimer).
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.
| Membres | Rôle | Détaillé dans |
|---|---|---|
of_reset | Remettre le composant à zéro | 3.6 Remettre un composant à zéro : of_reset() |
of_register_shortcut · of_clear_shortcuts | Raccourcis clavier du composant | 3.5 Les raccourcis clavier |
of_is_created · of_is_ready · of_get_last_error | S'il est né, s'il est prêt, ce qui a échoué | 3.7 Diagnostic |
of_save_as_png · of_save_as_jpg | Exporter le rendu en image | 3.8 Exporter le rendu en image |
of_set_redraw | Grouper les modifications en un seul repaint | 3.10 Bonnes pratiques |
of_preload_icons | Icônes affichées sans délai | Affichage instantané : of_icon |
of_set_translation | Traduire un libellé du composant | 5.2 Adapter un libellé : of_set_translation |
of_focus_webview | Donner le focus au composant | 6.4 Clavier et focus |
of_print · of_print_to_pdf | Imprimer, ou écrire un PDF | 6.9 Imprimer |
of_set_property · of_get_property · of_component_name | Piloter une propriété par son nom | 3.1 Le moteur de propriétés |
is_accessible_name · is_accessible_description | Le nom et la description que dit un lecteur d'écran | 3.4 Propriétés et events optionnels |