jsontree — u_pbt_jsontree #
← Referência dos componentes · Índice do guia
jsontree mostra um valor JSON como uma árvore recolhível, colorida por tipo: um ecrã de configuração, uma resposta de API, uma depuração de integração. Define o texto JSON em
is_json, o componente mostra-o; um clique num nó reporta o seu caminho (ue_node_clicked), um JSON inválido levantaue_error. Não modifica nada: é um VISUALIZADOR.
▶ Ver ao vivo — Aplicação de demonstração, mosaico JSON tree, com o código e esta página lado a lado.
Em resumo #
| Userobject | u_pbt_jsontree |
| Entrada | O texto JSON, em is_json (uma cadeia) |
| Dobrar / desdobrar | Cada contentor pelo seu marcador + / − na margem dos números, pelo seu caminho (of_expand_path, of_collapse_path), ou tudo de uma vez (of_expand_all, of_collapse_all) |
| Retorno | Um clique num nó dá o seu caminho (ue_node_clicked), o de n_pbt_json: lines/1/sku; um JSON inválido levanta ue_error |
| Fidelidade | Cada número e cada chave mostram-se tal como recebidos: um identificador de 64 bits continua exato, 1.10 continua 1.10, uma chave duplicada mantém os dois membros |
Início 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
Propriedades #
| Propriedade | Tipo | Predefinido | Descrição |
|---|---|---|---|
is_json | string | "" | O texto JSON a mostrar. Um objeto, um array, um valor; lido e mostrado como uma árvore, cada número e cada chave tal como recebidos. Vazio limpa a árvore, sem erro; um JSON inválido levanta ue_error e não mostra nada. Relê-se exatamente como foi definido |
ib_wrap | boolean | true | As linhas longas quebram (true, por omissão) ou ficam numa linha com barra horizontal (false) — um aspeto de editor de código |
ib_search_enabled | boolean | true | Ctrl+F na árvore abre uma caixa de pesquisa — a mesma pesquisa que of_search: escrever realça, Enter ou F3 seguinte, Shift+Enter ou Shift+F3 anterior, Esc fecha. false deixa o atalho a uma aplicação que pesquisa a partir da sua própria caixa. A caixa tem dois botões antes do contador, Aa (ib_find_match_case) e ab (ib_find_whole_word); mudar uma opção relança a pesquisa em curso a partir da sua primeira ocorrência |
ib_find_match_case | boolean | false | Opção de pesquisa: só encontra o texto com as mesmas maiúsculas e minúsculas. O botão Aa da caixa de pesquisa (Ctrl+F) é o mesmo interruptor; vale para of_search e para o que o utilizador escreve. Lida em direto; of_reset repõe-na a false |
ib_find_whole_word | boolean | false | Opção de pesquisa: só encontra o texto como palavra inteira (uma letra, um algarismo ou um _ ao lado faz parte da palavra: id não é encontrado nem em user_id nem em ids). O botão ab da caixa de pesquisa é o mesmo interruptor. Lida em direto; of_reset repõe-na a false |
is_theme_style | string | "" | Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança |
is_theme_mode | string | "" | Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança |
il_theme_accent | long | -1 | Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema) |
is_tooltip | string | "" | Tooltip simples apresentado ao passar sobre o componente |
is_super_tooltip_title | string | "" | Título do tooltip enriquecido (prevalece sobre is_tooltip) |
is_super_tooltip_text | string | "" | Texto do tooltip enriquecido (aceita marcação enriquecida) |
is_super_tooltip_image | string | "" | Imagem do tooltip enriquecido |
Métodos #
| Método | Descrição |
|---|---|
of_expand_all ( ) → long | Desdobra todos os contentores. Nenhum ue_node_toggled: nenhum gesto abre a árvore inteira de uma vez. Devolve 0, -2 se o componente não estiver criado |
of_collapse_all ( ) → long | Dobra todos os contentores aninhados (o nível de cima continua visível). Uma seleção escondida por uma dobra passa para o bloco dobrado, e ue_selection_changed indica-o. Nenhum ue_node_toggled: nenhum gesto dobra a árvore inteira de uma vez. Devolve 0, -2 se o componente não estiver criado |
of_expand_path ( string as_path ) → long | Abre UM bloco (objeto ou array) pelo seu caminho, e os blocos acima dele para que se veja. Como o seu marcador +, levanta ue_node_toggled para o bloco e para cada bloco dobrado acima dele aberto pelo caminho (nada para um bloco já aberto). Devolve 0, -5 se nenhum bloco tiver esse caminho (desconhecido, ou uma folha), -2 se o componente não estiver criado |
of_collapse_path ( string as_path ) → long | Dobra UM bloco pelo seu caminho. Como o seu marcador −, levanta ue_node_toggled se o bloco estava aberto, e ue_selection_changed quando a seleção tem de passar para ele. Devolve 0, -5 se nenhum bloco tiver esse caminho (desconhecido, ou uma folha), -2 se o componente não estiver criado |
of_is_expanded ( string as_path ) → boolean | true se o bloco desse caminho estiver aberto, lido EM DIRETO; false se estiver dobrado, e para uma folha ou um caminho desconhecido. O suficiente para guardar o que o utilizador abriu e restabelecê-lo |
of_copy ( ) → long | Põe a seleção na área de transferência, como Ctrl+C na árvore: uma folha dá o seu valor DESCODIFICADO (uma cadeia sem aspas nem escapes), um bloco o seu texto JSON indentado. Devolve 0, -4 se nada estiver selecionado, -2 se o componente não estiver criado |
of_clear ( ) → long | Esvazia a árvore (como is_json = ""); ib_wrap, ib_search_enabled, ib_find_match_case e ib_find_whole_word mantêm o seu valor (é of_reset que repõe tudo). Devolve 0, -2 se o componente não estiver criado |
of_expand_to_level ( long al_level ) → long | Mostra a árvore até al_level: os blocos a essa profundidade ou mais dobram-se (1 = os filhos diretos do bloco raiz, 0 dobra a raiz). Nenhum ue_node_toggled; uma seleção que ele desloca para um bloco dobrado levanta ue_selection_changed. Devolve 0, -2 se o componente não estiver criado |
of_search ( string as_query ) → long | Realça cada ocorrência (sem distinguir maiúsculas por omissão — ver ib_find_match_case —, só palavras inteiras com ib_find_whole_word; duas numa linha contam duas) e salta para a primeira; só se abrem os blocos que escondem a ocorrência ATUAL, e of_clear_search volta a dobrá-los. ue_search_result diz quantas. A pesquisa incide sobre o texto MOSTRADO: um carácter escapado procura-se escapado (C:\\Temp). Uma pesquisa vazia equivale a of_clear_search. A caixa de pesquisa abre-se com a pesquisa dentro e o foco nela (a mesma que Ctrl+F): Enter passa à seguinte; com ib_search_enabled a false, a árvore apenas realça. Devolve 0, ou um código negativo |
of_search_next ( ) → long | Passa à ocorrência SEGUINTE (volta à primeira depois da última); ue_search_result dá a nova posição. Devolve 0, ou um código negativo |
of_search_prev ( ) → long | Passa à ocorrência ANTERIOR (volta à última antes da primeira); ue_search_result dá a nova posição. Devolve 0, ou um código negativo |
of_clear_search ( ) → long | Limpa a pesquisa: deixa de haver realce e ocorrência atual (of_match_count devolve 0), a caixa de pesquisa esvazia-se e fecha-se, e os blocos que a pesquisa abrira voltam a dobrar-se como antes. Devolve 0, ou um código negativo |
of_select_path ( string as_path ) → long | Seleciona o nó em as_path e desloca-se até ele; como o teclado, levanta ue_selection_changed (nada se o nó já estiver selecionado); os blocos dobrados que o escondem abrem-se. as_path é um caminho de n_pbt_json (lines/1/sku, "" = a raiz). Devolve 0, -5 se nenhum nó tiver esse caminho (a seleção não se move), -2 se o componente não estiver criado |
of_selected_path ( ) → string | O caminho do nó selecionado, lido EM DIRETO: o de n_pbt_json, níveis unidos por / e um índice de array contado a partir de 1 (lines/1/sku), para passar tal como está a of_get_string sobre o mesmo texto. Uma chave vazia ou que contenha / não é endereçável. "" é a raiz, ou nada selecionado: of_has_selection distingue-os |
of_selected_value ( ) → string | O valor JSON da linha selecionada quando é uma FOLHA (uma string mantém as aspas, pronta a colar), lido AO VIVO. Vazio para um contentor ou sem seleção |
of_selected_text ( ) → string | O VALOR da folha selecionada, descodificado, lido EM DIRETO: uma cadeia sem as aspas nem os escapes, um número ou true/false/null tal como escritos. Vazio para um contentor ou sem seleção |
of_has_selection ( ) → boolean | true quando um nó está selecionado, lido EM DIRETO — a raiz incluída, cujo caminho é "" |
of_match_count ( ) → long | Devolve o número de OCORRÊNCIAS da pesquisa atual (duas numa linha contam duas), lido EM DIRETO — o 12 de uma barra de estado 3 / 12. 0 sem pesquisa |
of_match_index ( ) → long | Devolve a posição (1-based) da correspondência atual, lida AO VIVO — o 3 de uma barra de estado 3 / 12. 0 sem correspondência |
Eventos #
| Evento | Quando |
|---|---|
ue_node_clicked (string as_path) | O utilizador clicou num nó, ou premiu Enter numa folha selecionada: o seu caminho, o de n_pbt_json (lines/1/sku, "" para a raiz) — of_get_string(as_path) sobre o mesmo texto lê o seu valor. Enter num bloco dobra-o, e nunca chega ao botão predefinido da janela |
ue_node_toggled (string as_path, boolean ab_expanded) | Um bloco foi dobrado (ab_expanded = false) ou aberto (true): pelo utilizador (o seu marcador + / −, as setas, Enter ou Espaço) ou por of_expand_path / of_collapse_path. of_expand_all, of_collapse_all e of_expand_to_level não o levantam: nenhum gesto dobra a árvore inteira |
ue_selection_changed (string as_path) | A seleção moveu-se sem clique, pelo utilizador ou pelo seu código: setas, Home/End, Page Up/Down, of_select_path, ou uma dobra que esconde a linha selecionada (a seleção passa então para o bloco dobrado) — um clique do rato reporta ue_node_clicked |
ue_search_result (long al_count, long al_index) | Uma pesquisa começou ou avançou: al_count ocorrências no total, a atual é al_index (a partir de 1, 0 se nenhuma) — o suficiente para mostrar «3 / 12» |
ue_error (string as_message) | O texto em is_json não é um JSON válido: a mensagem diz porquê, com a linha e a coluna, na língua de apresentação; a árvore fica vazia. Levantado também para um documento demasiado grande para ser mostrado (mais de 1 500 000 linhas) |
Exemplo #
Explorar a resposta de uma 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
Ler o valor de um nó clicado #
// ue_node_clicked of uo_json : the path is the one n_pbt_json reads
n_pbt_json lnv_json
// Read the value at the clicked path with n_pbt_json
lnv_json.of_load(/*json*/ uo_json.is_json)
st_value.text = lnv_json.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()
Pesquisar palavras inteiras, com maiú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")
Boas práticas #
- É um visualizador, não um editor: mostra o JSON, não o altera. Para ler um valor, passe o caminho de
ue_node_clickedan_pbt_json.of_get_stringsobre o mesmo texto, ou leiaof_selected_text. - Um JSON grande continua fluido: só se desenham as linhas no ecrã, uma resposta de várias centenas de KB percorre-se com o teclado sem esperas.
of_collapse_allprimeiro continua a ser o mais legível. - Um JSON inválido não parte nada:
ue_errordi-lo (com a linha e a coluna do erro), a árvore fica vazia. É a resposta a mostrar, não uma falha. - Uma chave vazia ou que contenha
/não tem caminho:n_pbt_jsontambém não a sabe endereçar. Duas chaves idênticas num mesmo objeto mostram-se ambas; o caminho designa a primeira. - Da direita para a esquerda: um documento JSON é um texto da esquerda para a direita, e a árvore continua assim numa aplicação RTL (só a caixa de pesquisa segue o sentido da aplicação).
- O teclado fica com a árvore: Enter dobra um bloco ou «clica» numa folha (
ue_node_clicked), nunca o botão predefinido da janela; Esc fecha primeiro a caixa de pesquisa aberta, depois volta à janela; as linhas de fecho (},]) não são posições da seleção; Ctrl+C copia a seleção (of_copy). - Documentos muito grandes: acima de 1 500 000 linhas o documento é recusado com
ue_errorem vez de cortado em silêncio. A impressão (of_print,of_print_to_pdf) produz o documento inteiro, até 10 000 linhas.
Herdado da base comum #
Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.
| Membros | Função | Detalhado em |
|---|---|---|
of_reset | Repor o componente a zero | 3.6 Repor um componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atalhos de teclado do componente | 3.5 Os atalhos de teclado |
of_is_created · of_is_ready · of_get_last_error | Se nasceu, se está pronto, o que falhou | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar a renderização como imagem | 3.8 Exportar a representação como imagem |
of_set_redraw | Agrupar as alterações num único repinte | 3.10 Boas práticas |
of_preload_icons | Ícones mostrados sem atraso | Apresentação instantânea: of_icon |
of_set_translation | Traduzir uma legenda do componente | 5.2 Adaptar uma etiqueta: of_set_translation |
of_focus_webview | Dar o foco ao componente | 6.4 Teclado e focus |
of_print · of_print_to_pdf | Imprimir, ou escrever um PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar uma propriedade pelo nome | 3.1 O motor de propriedades |