PBToolboxAI v5 ← Site

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 lanza ue_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 #

Userobjectu_pbt_jsontree
EntradaEl texto JSON, en is_json (una cadena)
Plegar / desplegarCada 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)
RetornoUn 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
FidelidadCada 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 #

PropiedadTipoPredeterminadoDescripción
is_jsonstring""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_wrapbooleantrueLas 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_enabledbooleantrueCtrl+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_casebooleanfalseOpció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_wordbooleanfalseOpció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_decodedbooleanfalseOpció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_layoutstring—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_pathstring""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_valuestring""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_textstring""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_typestring""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_countlong-1Solo 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_selectionbooleanfalseSolo lectura. true cuando hay un nodo seleccionado, leído EN DIRECTO — la raíz incluida, cuya ruta es ""
ib_selected_addressablebooleanfalseSolo 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_countlong0Solo 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_indexlong0Solo 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_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)
is_tooltipstring""Tooltip simple mostrado al pasar el ratón por el componente
is_super_tooltip_titlestring""Título del tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto del tooltip enriquecido (se acepta el marcado enriquecido)
is_super_tooltip_imagestring""Imagen del tooltip enriquecido

Métodos #

MétodoDescripción
of_expand_all ( ) → longDespliega 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 ( ) → longPliega 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 ) → longAbre 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 ) → longPliega 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 ) → booleantrue 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 ( ) → longPone 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 ( ) → longPone 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 ( ) → longVací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 ) → longMuestra 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 ) → longResalta 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 ( ) → longPasa 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 ( ) → longPasa 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 ( ) → longBorra 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 ) → longSelecciona 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 #

EventoCuá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 #


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.

MiembrosFunciónDetallado en
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
ib_created · ib_ready · is_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · is_component_nameControlar una propiedad por su nombre3.1 El motor de propiedades
is_accessible_name · is_accessible_descriptionEl nombre y la descripción que dice un lector de pantalla3.4 Propiedades y eventos opcionales

← Referencia de componentes · Índice de la guía