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 três botões antes do contador, Aa (ib_find_match_case), ab (ib_find_whole_word) e & (ib_find_decoded); 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 |
ib_find_decoded | boolean | false | Opção de pesquisa: pesquisa nos VALORES descodificados — uma chave e uma cadeia lidas como n_pbt_json as lê (say "hi" encontra as aspas escapadas, uma letra acentuada o seu escape \u, uma quebra de linha o seu \n); o realce cobre o escape inteiro, um número e a pontuação ficam tal como são mostrados. false pesquisa o texto tal como é mostrado. O botão & 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, uma folha, ou um bloco vazio {} / []), -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, uma folha, ou um bloco vazio {} / []), -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 estado de todos os blocos de uma vez, para o guardar e restabelecer: of_get_layout |
of_get_layout ( ) → string | A disposição da árvore, lida EM DIRETO, como texto JSON a guardar: os blocos dobrados (collapsed, ou expanded quando essa lista for mais curta — todo o bloco que ela não nomeia fica então dobrado), o caminho selecionado (selected, null sem seleção) e a linha no topo da vista (top, um caminho, nunca píxeis). A devolver a of_set_layout, também depois de um novo documento |
of_set_layout ( string as_layout_json ) → long | Devolve à árvore uma disposição dada por of_get_layout: as dobras (um caminho que o documento já não tem é ignorado, um bloco novo mantém o seu valor predefinido), a seleção (ue_selection_changed, como of_select_path) e a linha do topo. ue_layout_changed segue uma vez se as dobras mudaram. Devolve 0, -5 se o texto não for um objeto JSON, -2 se o componente não estiver criado |
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; um pedaço de texto realçado com o rato é o que Ctrl+C copia. Devolve 0, -4 se nada estiver selecionado, -2 se o componente não estiver criado |
of_copy_path ( ) → long | Põe o CAMINHO do nó selecionado na área de transferência (team/1/name, "" para a raiz), pronto para n_pbt_json. Devolve 0, -4 se nada estiver selecionado ou se o caminho ler outro nó (of_selected_addressable a false), -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) — com ib_find_decoded, nos valores descodificados. 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. Um / ou um ~ de uma chave escreve-se ~1 ou ~0, como em JSON Pointer: application~1json é a chave application/json. of_selected_addressable diz false para o raro nó cujo caminho lê outro. "" é 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_selected_addressable ( ) → boolean | true quando o caminho do nó selecionado, dado a n_pbt_json sobre o mesmo documento, lê ESSE nó — lido EM DIRETO. false sem seleção, e sob a SEGUNDA de duas chaves idênticas (o seu caminho lê a primeira). Uma chave VAZIA é um nível vazio do caminho (a//b, / para a da raiz): é endereçável |
of_selected_type ( ) → string | O tipo JSON do nó selecionado, com as palavras de n_pbt_json.of_type: object, array, string, number, boolean ou null — lido EM DIRETO. "" sem seleção |
of_selected_count ( ) → long | O número de membros (um objeto) ou de elementos (um array) do nó selecionado, contados como n_pbt_json.of_count os conta — lido EM DIRETO. -1 para um valor que não seja um bloco, ou sem seleção, -2 se o componente não estiver criado |
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, um / ou um ~ de uma chave escrito ~1 ou ~0) — 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_rclicked (string as_path, long al_x, long al_y) | Clique direito num nó, ou tecla Menu (Shift+F10) na árvore: o nó é primeiro selecionado (ue_selection_changed se a seleção se moveu), as_path é o seu caminho, al_x / al_y o ponto no ECRÃ, em píxeis. Abra aí o seu próprio menu (um u_pbt_contextmenu): a árvore não tem |
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_layout_changed (string as_layout_json) | As dobras mudaram — um gesto, uma ordem do seu código (of_collapse_all incluído), um novo documento, of_set_layout: as_layout_json é a disposição inteira, como of_get_layout a dá, pronta a guardar. Uma mudança de seleção ou de deslocamento não o levanta |
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»; quando uma pesquisa se fecha (Esc na caixa, of_clear_search, of_reset, ib_search_enabled = false), (0, 0) uma vez |
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 #
// 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()
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")
Manter as dobras quando a resposta é atualizada #
// 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)
Um menu sobre um nó #
// 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
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. - Toda a chave tem um caminho: um
/ou um~escreve-se nela~1ou~0(JSON Pointer), en_pbt_jsonlê-a assim —paths/~1users~1{id}para uma especificação OpenAPI. Uma chave VAZIA é um nível vazio (a//b,/para a da raiz). Uma exceção, queof_selected_addressableassinala: o que está sob a segunda de duas chaves idênticas (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), ou o pedaço de texto realçado com o rato; Espaço dobra um bloco e nunca desloca a vista; a tecla Menu (Shift+F10) levantaue_node_rclicked. - 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 que está aberto, até 10 000 linhas: um bloco dobrado imprime-se dobrado (of_expand_allantes, para imprimir tudo).
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 |
is_accessible_name · is_accessible_description | O nome e a descrição que um leitor de ecrã diz | 3.4 Propriedades e eventos opcionais |