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.is_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_layout | string | — | La disposición del árbol como texto JSON — la misma propiedad en todo componente que el usuario puede reorganizar: se lee para guardarla, se escribe para restablecerla. Contiene 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), leída EN VIVO. Escrita, devuelve 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. Vuelva a escribirla también tras un documento nuevo. Un texto que no es un objeto JSON no cambia nada, y is_last_error dice por qué |
is_selected_path | string | "" | Solo lectura. 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. ib_selected_addressable dice false para el raro nodo cuya ruta lee otro. "" es la raíz, o nada seleccionado: ib_has_selection los distingue |
is_selected_value | string | "" | Solo lectura. 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 |
is_selected_text | string | "" | Solo lectura. 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 |
is_selected_type | string | "" | Solo lectura. 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 |
il_selected_count | long | -1 | Solo lectura. 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 |
ib_has_selection | boolean | false | Solo lectura. true cuando hay un nodo seleccionado, leído EN DIRECTO — la raíz incluida, cuya ruta es "" |
ib_selected_addressable | boolean | false | Solo lectura. 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 |
il_match_count | long | 0 | Solo lectura. 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 |
il_match_index | long | 0 | Solo lectura. 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 |
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: is_layout |
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 (ib_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 (il_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 |
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, is_layout escrita: as_layout_json es la disposición entera, como la da is_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.is_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.is_response_text
inv_doc.of_load(/*json*/ inv_rest.is_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.is_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.is_layout
uo_json.is_json = inv_rest.is_response_text
// The same blocks fold again ; a path the new text no longer has is ignored
uo_json.is_layout = 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 leais_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, queib_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 |
ib_created · ib_ready · is_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 · is_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 |