jsontree — u_pbt_jsontree #
← Referencia de componentes · Índice de la guía
jsontree muestra un valor JSON como un árbol plegable, coloreado por tipo: una pantalla de configuración, una respuesta de API, una depuración de integración. Fija el texto JSON en
is_json, el componente lo muestra; un clic en un nodo reporta su ruta (ue_node_clicked), un JSON inválido lanzaue_error. No modifica nada: es un VISOR.
▶ Verlo en vivo — Aplicación de demostración, mosaico JSON tree, con el código y esta página lado a lado.
De un vistazo #
| Userobject | u_pbt_jsontree |
| Entrada | El texto JSON, en is_json (una cadena) |
| Plegar / desplegar | Cada contenedor por su marcador + / − en el margen de los números, por su ruta (of_expand_path, of_collapse_path), o todo de una vez (of_expand_all, of_collapse_all) |
| Retorno | Un clic en un nodo da su ruta (ue_node_clicked), la de n_pbt_json: lines/1/sku; un JSON inválido lanza ue_error |
| Fidelidad | Cada número y cada clave se muestran tal como se recibieron: un identificador de 64 bits sigue exacto, 1.10 sigue siendo 1.10, una clave duplicada conserva sus dos miembros |
Inicio rápido #
// 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
Propiedades #
| Propiedad | Tipo | Predeterminado | Descripción |
|---|---|---|---|
is_json | string | "" | El texto JSON que mostrar. Un objeto, un array, un valor; leído y mostrado como un árbol, cada número y cada clave tal como se recibieron. Vacío borra el árbol, sin error; un JSON inválido lanza ue_error y no muestra nada. Se relee tal como se fijó |
ib_wrap | boolean | true | Las líneas largas se ajustan (true, por defecto) o se quedan en una línea con barra horizontal (false) — un aspecto de editor de código |
ib_search_enabled | boolean | true | Ctrl+F en el árbol abre un cuadro de búsqueda — la misma búsqueda que of_search: escribir resalta, Intro o F3 siguiente, Mayús+Intro o Mayús+F3 anterior, Esc cierra. false deja el atajo a una aplicación que busca desde su propio cuadro. El cuadro lleva tres botones antes del contador, Aa (ib_find_match_case), ab (ib_find_whole_word) y & (ib_find_decoded); cambiar una opción relanza la búsqueda en curso desde su primera aparición |
ib_find_match_case | boolean | false | Opción de búsqueda: solo encuentra el texto con las mismas mayúsculas y minúsculas. El botón Aa del cuadro de búsqueda (Ctrl+F) es el mismo interruptor; vale para of_search y para lo que el usuario escribe. Leída en directo; of_reset la devuelve a false |
ib_find_whole_word | boolean | false | Opción de búsqueda: solo encuentra el texto como palabra completa (una letra, una cifra o un _ al lado forma parte de la palabra: id no se encuentra ni en user_id ni en ids). El botón ab del cuadro de búsqueda es el mismo interruptor. Leída en directo; of_reset la devuelve a false |
ib_find_decoded | boolean | false | Opción de búsqueda: busca en los VALORES decodificados — una clave y una cadena leídas como las lee n_pbt_json (say "hi" encuentra las comillas escapadas, una letra acentuada su escape \u, un salto de línea su \n); el resaltado cubre el escape entero, un número y la puntuación quedan tal como se muestran. false busca el texto tal como se muestra. El botón & del cuadro de búsqueda es el mismo interruptor. Leída en directo; of_reset la devuelve a false |
is_theme_style | string | "" | Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio |
is_theme_mode | string | "" | Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio |
il_theme_accent | long | -1 | Color de acento de este componente (-1 = acento de la aplicación, o el del tema) |
is_tooltip | string | "" | Tooltip simple mostrado al pasar el ratón por el componente |
is_super_tooltip_title | string | "" | Título del tooltip enriquecido (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto del tooltip enriquecido (se acepta el marcado enriquecido) |
is_super_tooltip_image | string | "" | Imagen del tooltip enriquecido |
Métodos #
| Método | Descripción |
|---|---|
of_expand_all ( ) → long | Despliega todos los contenedores. Ningún ue_node_toggled: ningún gesto abre el árbol entero de una vez. Devuelve 0, -2 si el componente no está creado |
of_collapse_all ( ) → long | Pliega todos los contenedores anidados (el nivel superior sigue visible). Una selección ocultada por un pliegue pasa al bloque plegado, y ue_selection_changed lo indica. Ningún ue_node_toggled: ningún gesto pliega el árbol entero de una vez. Devuelve 0, -2 si el componente no está creado |
of_expand_path ( string as_path ) → long | Abre UN bloque (objeto o array) por su ruta, y los bloques por encima de él para que se vea. Como su marcador +, lanza ue_node_toggled para el bloque y para cada bloque plegado por encima abierto en el camino (nada para un bloque ya abierto). Devuelve 0, -5 si ningún bloque tiene esa ruta (desconocida, una hoja, o un bloque vacío {} / []), -2 si el componente no está creado |
of_collapse_path ( string as_path ) → long | Pliega UN bloque por su ruta. Como su marcador −, lanza ue_node_toggled si el bloque estaba abierto, y ue_selection_changed cuando la selección debe pasar a él. Devuelve 0, -5 si ningún bloque tiene esa ruta (desconocida, una hoja, o un bloque vacío {} / []), -2 si el componente no está creado |
of_is_expanded ( string as_path ) → boolean | true si el bloque de esa ruta está abierto, leído EN VIVO; false si está plegado, y para una hoja o una ruta desconocida. El estado de todos los bloques de una vez, para guardarlo y restablecerlo: of_get_layout |
of_get_layout ( ) → string | La disposición del árbol, leída EN VIVO, como texto JSON que guardar: los bloques plegados (collapsed, o expanded cuando esa lista es más corta — todo bloque que no nombra queda entonces plegado), la ruta seleccionada (selected, null sin selección) y la línea en lo alto de la vista (top, una ruta, nunca píxeles). Para devolverla a of_set_layout, también tras un documento nuevo |
of_set_layout ( string as_layout_json ) → long | Devuelve al árbol una disposición dada por of_get_layout: los pliegues (una ruta que el documento ya no tiene se ignora, un bloque nuevo conserva su valor por defecto), la selección (ue_selection_changed, como of_select_path) y la línea de arriba. ue_layout_changed sigue una vez si los pliegues cambiaron. Devuelve 0, -5 si el texto no es un objeto JSON, -2 si el componente no está creado |
of_copy ( ) → long | Pone la selección en el portapapeles, como Ctrl+C en el árbol: una hoja da su valor DECODIFICADO (una cadena sin comillas ni escapes), un bloque su texto JSON sangrado; un trozo de texto resaltado con el ratón es lo que copia Ctrl+C. Devuelve 0, -4 si no hay nada seleccionado, -2 si el componente no está creado |
of_copy_path ( ) → long | Pone la RUTA del nodo seleccionado en el portapapeles (team/1/name, "" para la raíz), lista para n_pbt_json. Devuelve 0, -4 si no hay nada seleccionado o si la ruta lee otro nodo (of_selected_addressable a false), -2 si el componente no está creado |
of_clear ( ) → long | Vacía el árbol (como is_json = ""); ib_wrap, ib_search_enabled, ib_find_match_case e ib_find_whole_word conservan su valor (es of_reset el que lo restablece todo). Devuelve 0, -2 si el componente no está creado |
of_expand_to_level ( long al_level ) → long | Muestra el árbol hasta al_level: los bloques a esa profundidad o más se pliegan (1 = los hijos directos del bloque raíz, 0 pliega la raíz). Ningún ue_node_toggled; una selección que mueve a un bloque plegado lanza ue_selection_changed. Devuelve 0, -2 si el componente no está creado |
of_search ( string as_query ) → long | Resalta cada ocurrencia (sin distinguir mayúsculas por defecto — véase ib_find_match_case —, solo palabras completas con ib_find_whole_word; dos en una línea cuentan dos) y salta a la primera; solo se abren los bloques que ocultan la ocurrencia ACTUAL, y of_clear_search los vuelve a plegar. ue_search_result dice cuántas. La búsqueda mira el texto MOSTRADO: un carácter escapado se busca escapado (C:\\Temp) — con ib_find_decoded, en los valores decodificados. Una búsqueda vacía equivale a of_clear_search. El cuadro de búsqueda se abre con la búsqueda dentro y el foco en él (el mismo que Ctrl+F): Intro pasa a la siguiente; con ib_search_enabled en false, el árbol solo resalta. Devuelve 0, o un código negativo |
of_search_next ( ) → long | Pasa a la ocurrencia SIGUIENTE (vuelve a la primera tras la última); ue_search_result da la nueva posición. Devuelve 0, o un código negativo |
of_search_prev ( ) → long | Pasa a la ocurrencia ANTERIOR (vuelve a la última antes de la primera); ue_search_result da la nueva posición. Devuelve 0, o un código negativo |
of_clear_search ( ) → long | Borra la búsqueda: ya no hay resaltado ni ocurrencia actual (of_match_count devuelve 0), el cuadro de búsqueda se vacía y se cierra, y los bloques que la búsqueda había abierto se vuelven a plegar como antes. Devuelve 0, o un código negativo |
of_select_path ( string as_path ) → long | Selecciona el nodo en as_path y se desplaza hasta él; como el teclado, lanza ue_selection_changed (nada si el nodo ya está seleccionado); los bloques plegados que lo ocultan se abren. as_path es una ruta de n_pbt_json (lines/1/sku, "" = la raíz). Devuelve 0, -5 si ningún nodo tiene esa ruta (la selección no se mueve), -2 si el componente no está creado |
of_selected_path ( ) → string | La ruta del nodo seleccionado, leída EN DIRECTO: la de n_pbt_json, niveles unidos por / y un índice de array contado desde 1 (lines/1/sku), para pasarla tal cual a of_get_string sobre el mismo texto. Un / o un ~ de una clave se escribe ~1 o ~0, como en JSON Pointer: application~1json es la clave application/json. of_selected_addressable dice false para el raro nodo cuya ruta lee otro. "" es la raíz, o nada seleccionado: of_has_selection los distingue |
of_selected_value ( ) → string | El valor JSON de la línea seleccionada cuando es una HOJA (una cadena conserva sus comillas, lista para pegar), leído EN VIVO. Vacío para un contenedor o sin selección |
of_selected_text ( ) → string | El VALOR de la hoja seleccionada, decodificado, leído EN DIRECTO: una cadena sin sus comillas ni escapes, un número o true/false/null tal como están escritos. Vacío para un contenedor o sin selección |
of_has_selection ( ) → boolean | true cuando hay un nodo seleccionado, leído EN DIRECTO — la raíz incluida, cuya ruta es "" |
of_selected_addressable ( ) → boolean | true cuando la ruta del nodo seleccionado, dada a n_pbt_json sobre el mismo documento, lee ESE nodo — leído EN VIVO. false sin selección, y bajo la SEGUNDA de dos claves idénticas (su ruta lee la primera). Una clave VACÍA es un nivel vacío de la ruta (a//b, / para la de la raíz): es direccionable |
of_selected_type ( ) → string | El tipo JSON del nodo seleccionado, con las palabras de n_pbt_json.of_type: object, array, string, number, boolean o null — leído EN VIVO. "" sin selección |
of_selected_count ( ) → long | El número de miembros (un objeto) o de elementos (un array) del nodo seleccionado, contados como los cuenta n_pbt_json.of_count — leído EN VIVO. -1 para un valor que no es un bloque, o sin selección, -2 si el componente no está creado |
of_match_count ( ) → long | Devuelve el número de OCURRENCIAS de la búsqueda actual (dos en una línea cuentan dos), leído EN DIRECTO — el 12 de una barra de estado 3 / 12. 0 sin búsqueda |
of_match_index ( ) → long | Devuelve la posición (1-based) de la coincidencia actual, leída EN VIVO — el 3 de una barra de estado 3 / 12. 0 sin coincidencia |
Eventos #
| Evento | Cuándo |
|---|---|
ue_node_clicked (string as_path) | El usuario ha hecho clic en un nodo, o pulsado Intro sobre una hoja seleccionada: su ruta, la de n_pbt_json (lines/1/sku, "" para la raíz, un / o un ~ de una clave escrito ~1 o ~0) — of_get_string(as_path) sobre el mismo texto lee su valor. Intro sobre un bloque lo pliega, y nunca llega al botón por defecto de la ventana |
ue_node_rclicked (string as_path, long al_x, long al_y) | Clic derecho en un nodo, o tecla Menú (Mayús+F10) en el árbol: el nodo se selecciona primero (ue_selection_changed si la selección se movió), as_path es su ruta, al_x / al_y el punto en la PANTALLA, en píxeles. Abra ahí su propio menú (un u_pbt_contextmenu): el árbol no tiene |
ue_node_toggled (string as_path, boolean ab_expanded) | Un bloque se ha plegado (ab_expanded = false) o abierto (true): por el usuario (su marcador + / −, las flechas, Intro o Espacio) o por of_expand_path / of_collapse_path. of_expand_all, of_collapse_all y of_expand_to_level no lo lanzan: ningún gesto pliega el árbol entero |
ue_layout_changed (string as_layout_json) | Los pliegues cambiaron — un gesto, una orden de su código (of_collapse_all incluido), un documento nuevo, of_set_layout: as_layout_json es la disposición entera, como la da of_get_layout, lista para guardar. Un cambio de selección o de desplazamiento no lo lanza |
ue_selection_changed (string as_path) | La selección se ha movido sin clic, por el usuario o por su código: flechas, Inicio/Fin, Re Pág/Av Pág, of_select_path, o un pliegue que oculta la línea seleccionada (la selección pasa entonces al bloque plegado) — un clic de ratón reporta ue_node_clicked |
ue_search_result (long al_count, long al_index) | Una búsqueda ha empezado o avanzado: al_count ocurrencias en total, la actual es al_index (desde 1, 0 si ninguna) — lo necesario para mostrar «3 / 12»; cuando una búsqueda se cierra (Esc en el cuadro, of_clear_search, of_reset, ib_search_enabled = false), (0, 0) una vez |
ue_error (string as_message) | El texto en is_json no es un JSON válido: el mensaje dice por qué, con la línea y la columna, en el idioma de visualización; el árbol queda vacío. También se lanza para un documento demasiado grande para mostrarse (más de 1.500.000 líneas) |
Ejemplo #
Explorar la respuesta de una 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
Leer el valor de un nodo pulsado #
// 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()
Buscar palabras completas, con mayúsculas #
// 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")
Conservar los pliegues cuando se actualiza la respuesta #
// 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 menú sobre 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
Buenas prácticas #
- Es un visor, no un editor: muestra el JSON, no lo cambia. Para leer un valor, pase la ruta de
ue_node_clickedan_pbt_json.of_get_stringsobre el mismo texto, o leaof_selected_text. - Un JSON grande sigue fluido: solo se dibujan las líneas en pantalla, una respuesta de varios cientos de KB se recorre con el teclado sin esperas.
of_collapse_allprimero sigue siendo lo más legible. - Un JSON inválido no rompe nada:
ue_errorlo dice (con la línea y la columna del error), el árbol queda vacío. Es la respuesta que mostrar, no un fallo. - Toda clave tiene una ruta: un
/o un~se escribe en ella~1o~0(JSON Pointer), yn_pbt_jsonla lee así —paths/~1users~1{id}para una especificación OpenAPI. Una clave VACÍA es un nivel vacío (a//b,/para la de la raíz). Una excepción, queof_selected_addressableseñala: lo que está bajo la segunda de dos claves idénticas (la ruta designa la primera). - De derecha a izquierda: un documento JSON es un texto de izquierda a derecha, y el árbol lo sigue siendo en una aplicación RTL (solo el cuadro de búsqueda sigue el sentido de la aplicación).
- El teclado se queda en el árbol: Intro pliega un bloque o «hace clic» en una hoja (
ue_node_clicked), nunca el botón por defecto de la ventana; Esc cierra primero el cuadro de búsqueda abierto y luego vuelve a la ventana; las líneas de cierre (},]) no son posiciones de la selección; Ctrl+C copia la selección (of_copy), o el trozo de texto resaltado con el ratón; Espacio pliega un bloque y nunca desplaza la vista; la tecla Menú (Mayús+F10) lanzaue_node_rclicked. - Documentos muy grandes: por encima de 1.500.000 líneas el documento se rechaza con
ue_erroren lugar de cortarse en silencio. La impresión (of_print,of_print_to_pdf) saca lo que está desplegado, hasta 10.000 líneas: un bloque plegado se imprime plegado (of_expand_allantes, para imprimirlo todo).
Heredado de la base común #
Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.
| Miembros | Función | Detallado en |
|---|---|---|
of_reset | Poner el componente a cero | 3.6 Poner un componente a cero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atajos de teclado del componente | 3.5 Los atajos de teclado |
of_is_created · of_is_ready · of_get_last_error | Si ha nacido, si está listo, qué ha fallado | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar el render como imagen | 3.8 Exportar la representación como imagen |
of_set_redraw | Agrupar los cambios en un solo repintado | 3.10 Buenas prácticas |
of_preload_icons | Iconos mostrados sin retardo | Visualización instantánea: of_icon |
of_set_translation | Traducir una etiqueta del componente | 5.2 Adaptar una etiqueta: of_set_translation |
of_focus_webview | Dar el foco al componente | 6.4 Teclado y foco |
of_print · of_print_to_pdf | Imprimir, o escribir un PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar una propiedad por su nombre | 3.1 El motor de propiedades |
is_accessible_name · is_accessible_description | El nombre y la descripción que dice un lector de pantalla | 3.4 Propiedades y eventos opcionales |