jsontree — u_pbt_jsontree #
← Riferimento dei componenti · Sommario della guida
jsontree mostra un valore JSON come un albero comprimibile, colorato per tipo: una schermata di configurazione, una risposta API, un debug di integrazione. Imposti il testo JSON in
is_json, il componente lo mostra; un clic su un nodo riporta il suo percorso (ue_node_clicked), un JSON non valido sollevaue_error. Non modifica nulla: è un VISUALIZZATORE.
▶ Vederlo dal vivo — Applicazione dimostrativa, tessera JSON tree, con il codice e questa pagina fianco a fianco.
In breve #
| Userobject | u_pbt_jsontree |
| Ingresso | Il testo JSON, in is_json (una stringa) |
| Piega / dispiega | Ogni contenitore con il suo indicatore + / − nel margine dei numeri, con il suo percorso (of_expand_path, of_collapse_path), o tutto in una volta (of_expand_all, of_collapse_all) |
| Ritorno | Un clic su un nodo dà il suo percorso (ue_node_clicked), quello di n_pbt_json: lines/1/sku; un JSON non valido solleva ue_error |
| Fedeltà | Ogni numero e ogni chiave si mostrano come ricevuti: un identificativo a 64 bit resta esatto, 1.10 resta 1.10, una chiave doppia conserva entrambi i membri |
Avvio rapido #
// 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
Proprietà #
| Proprietà | Tipo | Predefinito | Descrizione |
|---|---|---|---|
is_json | string | "" | Il testo JSON da mostrare. Un oggetto, un array, un valore; letto e mostrato come un albero, ogni numero e ogni chiave come ricevuti. Vuoto svuota l'albero, senza errore; un JSON non valido solleva ue_error e non mostra nulla. Si rilegge esattamente come è stato impostato |
ib_wrap | boolean | true | Le righe lunghe vanno a capo (true, predefinito) o restano su una riga con barra orizzontale (false) — un aspetto da editor di codice |
ib_search_enabled | boolean | true | Ctrl+F nell'albero apre una casella di ricerca — la stessa ricerca di of_search: digitare evidenzia, Invio o F3 successivo, Maiusc+Invio o Maiusc+F3 precedente, Esc chiude. false lascia la scorciatoia a un'applicazione che cerca dalla propria casella. La casella porta tre pulsanti prima del contatore, Aa (ib_find_match_case), ab (ib_find_whole_word) e & (ib_find_decoded); cambiare un'opzione rilancia la ricerca in corso dalla sua prima occorrenza |
ib_find_match_case | boolean | false | Opzione di ricerca: trova solo il testo con le stesse maiuscole/minuscole. Il pulsante Aa della casella di ricerca (Ctrl+F) è lo stesso interruttore; vale per of_search e per ciò che l'utente digita. Letta in tempo reale; of_reset la rimette a false |
ib_find_whole_word | boolean | false | Opzione di ricerca: trova il testo solo come parola intera (una lettera, una cifra o un _ accanto fa parte della parola: id non viene trovato né in user_id né in ids). Il pulsante ab della casella di ricerca è lo stesso interruttore. Letta in tempo reale; of_reset la rimette a false |
ib_find_decoded | boolean | false | Opzione di ricerca: cerca nei VALORI decodificati — una chiave e una stringa lette come le legge n_pbt_json (say "hi" trova le virgolette con escape, una lettera accentata il suo escape \u, un ritorno a capo il suo \n); l'evidenziazione copre l'intero escape, un numero e la punteggiatura restano come mostrati. false cerca il testo così com'è mostrato. Il pulsante & della casella di ricerca è lo stesso interruttore. Letta in tempo reale; of_reset la rimette a false |
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio |
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema) |
is_tooltip | string | "" | Tooltip semplice mostrato al passaggio del mouse sul componente |
is_super_tooltip_title | string | "" | Titolo del tooltip avanzato (prevale su is_tooltip) |
is_super_tooltip_text | string | "" | Testo del tooltip avanzato (markup avanzato accettato) |
is_super_tooltip_image | string | "" | Immagine del tooltip avanzato |
Metodi #
| Metodo | Descrizione |
|---|---|
of_expand_all ( ) → long | Dispiega tutti i contenitori. Nessun ue_node_toggled: nessun gesto apre l'intero albero in una volta. Restituisce 0, -2 se il componente non è creato |
of_collapse_all ( ) → long | Piega tutti i contenitori annidati (il livello superiore resta visibile). Una selezione nascosta da una piega passa sul blocco piegato, e ue_selection_changed lo segnala. Nessun ue_node_toggled: nessun gesto piega l'intero albero in una volta. Restituisce 0, -2 se il componente non è creato |
of_expand_path ( string as_path ) → long | Apre UN blocco (oggetto o array) con il suo percorso, e i blocchi sopra di lui perché si veda. Come il suo indicatore +, solleva ue_node_toggled per il blocco e per ogni blocco piegato sopra di lui aperto lungo il percorso (nulla per un blocco già aperto). Restituisce 0, -5 se nessun blocco ha quel percorso (sconosciuto, una foglia, o un blocco vuoto {} / []), -2 se il componente non è creato |
of_collapse_path ( string as_path ) → long | Piega UN blocco con il suo percorso. Come il suo indicatore −, solleva ue_node_toggled se il blocco era aperto, e ue_selection_changed quando la selezione deve passare su di lui. Restituisce 0, -5 se nessun blocco ha quel percorso (sconosciuto, una foglia, o un blocco vuoto {} / []), -2 se il componente non è creato |
of_is_expanded ( string as_path ) → boolean | true se il blocco di quel percorso è aperto, letto IN DIRETTA; false se è piegato, e per una foglia o un percorso sconosciuto. Lo stato di tutti i blocchi in una volta, per salvarlo e ripristinarlo: of_get_layout |
of_get_layout ( ) → string | La disposizione dell'albero, letta IN DIRETTA, come testo JSON da salvare: i blocchi piegati (collapsed, oppure expanded quando questa lista è più corta — ogni blocco che non nomina è allora piegato), il percorso selezionato (selected, null senza selezione) e la riga in cima alla vista (top, un percorso, mai pixel). Da restituire a of_set_layout, anche dopo un nuovo documento |
of_set_layout ( string as_layout_json ) → long | Restituisce all'albero una disposizione data da of_get_layout: le pieghe (un percorso che il documento non ha più è ignorato, un blocco nuovo mantiene il suo valore predefinito), la selezione (ue_selection_changed, come of_select_path) e la riga in cima. ue_layout_changed segue una volta se le pieghe sono cambiate. Restituisce 0, -5 se il testo non è un oggetto JSON, -2 se il componente non è creato |
of_copy ( ) → long | Mette la selezione negli appunti, come Ctrl+C nell'albero: una foglia dà il suo valore DECODIFICATO (una stringa senza virgolette né escape), un blocco il suo testo JSON indentato; un pezzo di testo evidenziato col mouse è ciò che Ctrl+C copia. Restituisce 0, -4 se nulla è selezionato, -2 se il componente non è creato |
of_copy_path ( ) → long | Mette il PERCORSO del nodo selezionato negli appunti (team/1/name, "" per la radice), pronto per n_pbt_json. Restituisce 0, -4 se nulla è selezionato o se il percorso legge un altro nodo (of_selected_addressable a false), -2 se il componente non è creato |
of_clear ( ) → long | Svuota l'albero (come is_json = ""); ib_wrap, ib_search_enabled, ib_find_match_case e ib_find_whole_word conservano il loro valore (è of_reset che rimette tutto). Restituisce 0, -2 se il componente non è creato |
of_expand_to_level ( long al_level ) → long | Mostra l'albero fino a al_level: i blocchi a quella profondità o oltre si piegano (1 = i figli diretti del blocco radice, 0 piega la radice). Nessun ue_node_toggled; una selezione che sposta su un blocco piegato solleva ue_selection_changed. Restituisce 0, -2 se il componente non è creato |
of_search ( string as_query ) → long | Evidenzia ogni occorrenza (senza distinzione di maiuscole per impostazione predefinita — vedere ib_find_match_case —, solo parole intere con ib_find_whole_word; due su una riga contano due) e salta alla prima; si aprono solo i blocchi che nascondono l'occorrenza CORRENTE, e of_clear_search li ripiega. ue_search_result dice quante. La ricerca avviene sul testo MOSTRATO: un carattere con escape si cerca con escape (C:\\Temp) — con ib_find_decoded, nei valori decodificati. Una ricerca vuota equivale a of_clear_search. La casella di ricerca si apre con la ricerca dentro e il focus su di essa (la stessa di Ctrl+F): Invio passa alla successiva; con ib_search_enabled a false, l'albero evidenzia soltanto. Restituisce 0, o un codice negativo |
of_search_next ( ) → long | Passa all'occorrenza SUCCESSIVA (torna alla prima dopo l'ultima); ue_search_result dà la nuova posizione. Restituisce 0, o un codice negativo |
of_search_prev ( ) → long | Passa all'occorrenza PRECEDENTE (torna all'ultima prima della prima); ue_search_result dà la nuova posizione. Restituisce 0, o un codice negativo |
of_clear_search ( ) → long | Cancella la ricerca: niente più evidenziazioni né occorrenza corrente (of_match_count restituisce 0), la casella di ricerca si svuota e si chiude, e i blocchi aperti dalla ricerca si ripiegano come prima. Restituisce 0, o un codice negativo |
of_select_path ( string as_path ) → long | Seleziona il nodo a as_path e scorre fino a esso; come la tastiera, solleva ue_selection_changed (nulla se il nodo è già selezionato); i blocchi piegati che lo nascondono si aprono. as_path è un percorso di n_pbt_json (lines/1/sku, "" = la radice). Restituisce 0, -5 se nessun nodo ha quel percorso (la selezione non si sposta), -2 se il componente non è creato |
of_selected_path ( ) → string | Il percorso del nodo selezionato, letto IN DIRETTA: quello di n_pbt_json, livelli uniti da / e un indice di array contato da 1 (lines/1/sku), da passare così com'è a of_get_string sullo stesso testo. Un / o un ~ di una chiave si scrive ~1 o ~0, come in JSON Pointer: application~1json è la chiave application/json. of_selected_addressable dice false per il raro nodo il cui percorso ne legge un altro. "" è la radice, o nessuna selezione: of_has_selection li distingue |
of_selected_value ( ) → string | Il valore JSON della riga selezionata quando è una FOGLIA (una stringa conserva le virgolette, pronta da incollare), letto DAL VIVO. Vuoto per un contenitore o senza selezione |
of_selected_text ( ) → string | Il VALORE della foglia selezionata, decodificato, letto IN DIRETTA: una stringa senza virgolette né escape, un numero o true/false/null come scritti. Vuoto per un contenitore o senza selezione |
of_has_selection ( ) → boolean | true quando un nodo è selezionato, letto IN DIRETTA — radice compresa, il cui percorso è "" |
of_selected_addressable ( ) → boolean | true quando il percorso del nodo selezionato, dato a n_pbt_json sullo stesso documento, legge QUEL nodo — letto IN DIRETTA. false senza selezione, e sotto la SECONDA di due chiavi identiche (il suo percorso legge la prima). Una chiave VUOTA è un livello vuoto del percorso (a//b, / per quella alla radice): è indirizzabile |
of_selected_type ( ) → string | Il tipo JSON del nodo selezionato, con le parole di n_pbt_json.of_type: object, array, string, number, boolean o null — letto IN DIRETTA. "" senza selezione |
of_selected_count ( ) → long | Il numero di membri (un oggetto) o di elementi (un array) del nodo selezionato, contati come li conta n_pbt_json.of_count — letto IN DIRETTA. -1 per un valore che non è un blocco, o senza selezione, -2 se il componente non è creato |
of_match_count ( ) → long | Restituisce il numero di OCCORRENZE della ricerca corrente (due su una riga contano due), letto IN DIRETTA — il 12 di una barra di stato 3 / 12. 0 senza ricerca |
of_match_index ( ) → long | Rende la posizione (1-based) della corrispondenza corrente, letta DAL VIVO — il 3 di una barra di stato 3 / 12. 0 senza corrispondenza |
Eventi #
| Evento | Quando |
|---|---|
ue_node_clicked (string as_path) | L'utente ha cliccato un nodo, o premuto Invio su una foglia selezionata: il suo percorso, quello di n_pbt_json (lines/1/sku, "" per la radice, un / o un ~ di una chiave scritto ~1 o ~0) — of_get_string(as_path) sullo stesso testo ne legge il valore. Invio su un blocco lo piega, e non raggiunge mai il pulsante predefinito della finestra |
ue_node_rclicked (string as_path, long al_x, long al_y) | Clic destro su un nodo, o tasto Menu (Maiusc+F10) nell'albero: il nodo è prima selezionato (ue_selection_changed se la selezione si è spostata), as_path è il suo percorso, al_x / al_y il punto sullo SCHERMO, in pixel. Aprite lì il vostro menu (un u_pbt_contextmenu): l'albero non ne ha |
ue_node_toggled (string as_path, boolean ab_expanded) | Un blocco è stato piegato (ab_expanded = false) o aperto (true): dall'utente (il suo indicatore + / −, le frecce, Invio o Spazio) o da of_expand_path / of_collapse_path. of_expand_all, of_collapse_all e of_expand_to_level non lo sollevano: nessun gesto piega l'intero albero |
ue_layout_changed (string as_layout_json) | Le pieghe sono cambiate — un gesto, un ordine del vostro codice (of_collapse_all compreso), un nuovo documento, of_set_layout: as_layout_json è la disposizione intera, come la dà of_get_layout, pronta da salvare. Un cambio di selezione o di scorrimento non lo solleva |
ue_selection_changed (string as_path) | La selezione si è spostata senza clic, dall'utente o dal vostro codice: frecce, Inizio/Fine, Pag su/giù, of_select_path, o una piega che nasconde la riga selezionata (la selezione passa allora sul blocco piegato) — un clic del mouse riporta ue_node_clicked |
ue_search_result (long al_count, long al_index) | Una ricerca è partita o è avanzata: al_count occorrenze in tutto, la corrente è al_index (da 1, 0 se nessuna) — quanto basta per mostrare «3 / 12»; quando una ricerca si chiude (Esc nella casella, of_clear_search, of_reset, ib_search_enabled = false), (0, 0) una volta |
ue_error (string as_message) | Il testo in is_json non è un JSON valido: il messaggio dice perché, con la riga e la colonna, nella lingua di visualizzazione; l'albero resta vuoto. Sollevato anche per un documento troppo grande per essere mostrato (più di 1.500.000 righe) |
Esempio #
Esplorare una risposta 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
Leggere il valore di un nodo cliccato #
// 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()
Cercare parole intere, maiuscole comprese #
// 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")
Mantenere le pieghe quando la risposta viene aggiornata #
// 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 su un nodo #
// 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
Buone pratiche #
- È un visualizzatore, non un editor: mostra il JSON, non lo cambia. Per leggere un valore, passate il percorso di
ue_node_clickedan_pbt_json.of_get_stringsullo stesso testo, oppure leggeteof_selected_text. - Un JSON grande resta fluido: si disegnano solo le righe sullo schermo, una risposta di diverse centinaia di KB si percorre da tastiera senza attese.
of_collapse_allper primo resta il più leggibile. - Un JSON non valido non rompe nulla:
ue_errorlo dice (con la riga e la colonna dell'errore), l'albero resta vuoto. È il riscontro da mostrare, non un crash. - Ogni chiave ha un percorso: un
/o un~vi si scrive~1o~0(JSON Pointer), en_pbt_jsonlo legge così —paths/~1users~1{id}per una specifica OpenAPI. Una chiave VUOTA è un livello vuoto (a//b,/per quella alla radice). Un'eccezione, cheof_selected_addressablesegnala: ciò che sta sotto la seconda di due chiavi identiche (il percorso designa la prima). - Da destra a sinistra: un documento JSON è un testo da sinistra a destra, e l'albero lo resta in un'applicazione RTL (solo la casella di ricerca segue il verso dell'applicazione).
- La tastiera resta all'albero: Invio piega un blocco o «clicca» una foglia (
ue_node_clicked), mai il pulsante predefinito della finestra; Esc chiude prima la casella di ricerca aperta, poi torna alla finestra; le righe di chiusura (},]) non sono posizioni della selezione; Ctrl+C copia la selezione (of_copy), o il pezzo di testo evidenziato col mouse; Spazio piega un blocco e non fa mai scorrere la vista; il tasto Menu (Maiusc+F10) sollevaue_node_rclicked. - Documenti molto grandi: oltre 1.500.000 righe il documento è rifiutato con
ue_errorinvece di essere troncato in silenzio. La stampa (of_print,of_print_to_pdf) produce ciò che è aperto, fino a 10.000 righe: un blocco piegato si stampa piegato (primaof_expand_all, per stampare tutto).
Ereditato dalla base comune #
Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |
is_accessible_name · is_accessible_description | Il nome e la descrizione che dice un lettore di schermo | 3.4 Proprietà ed event opzionali |