PBToolboxAI v4 ← Site

json — n_pbt_json #

← Referência dos componentes · Índice do guia

Construir um JSON tipo a tipo — texto, número, booleano, array, objeto aninhado — com o escape feito por si, e depois ler um ao longo de um caminho: of_load, of_get_string, of_type, of_count. Um único objeto constrói os seus pedidos e lê as suas respostas. Tudo em PowerScript puro: sem página, sem motor, PowerBuilder 10 incluído.

▶ Ver ao vivo — Aplicação de demonstração, mosaico JSON: os resultados, o código que os produz e esta página, lado a lado.


Em resumo #

n_pbt_json é autoinstantiate: declara-se como variável local, sem create nem destroy. É o mesmo objeto que, internamente, constrói os payloads enviados ao motor — agora oferecido ao seu código, do lado da construção e da leitura.

Início rápido #

Construir um payload, depois reler uma resposta — tudo cabe numa variável local:

// Local variables
n_pbt_json  lnv_json
string      ls_customer
double      ld_total

// Write : each member is typed and escaped for you - a path may have levels
lnv_json.of_set_string(/*path*/ "customer", /*value*/ "Ada")
lnv_json.of_set_number(/*path*/ "total", /*value*/ 690.50)
lnv_json.of_set_boolean(/*path*/ "paid", /*value*/ true)

// lnv_json.of_text() -> {"customer":"Ada","total":690.5,"paid":true}

// Read : load a response, reach values by path
lnv_json.of_load(/*json*/ '{"order":{"customer":"Ada","total":690.50}}')
IF lnv_json.of_is_valid() THEN
	ls_customer = lnv_json.of_get_string(/*path*/ "order/customer")   // Ada
	ld_total    = lnv_json.of_get_number(/*path*/ "order/total")     // 690.5
END IF

Um caminho são as chaves desde a raiz unidas por /; o índice de um array é a sua posição, contada a partir de 1, como toda a posição da biblioteca: order/lines/1 é a primeira linha, order/lines/0 não designa nada. Um segmento vazio (a//b, /a) ou um índice 0 num array não designa nada — uma escrita recusa-o com -5 — e uma chave que contém / não é endereçável. Se um objeto escrever a mesma chave duas vezes, é a sua PRIMEIRA ocorrência que é lida e escrita — um navegador guarda a última.


Construir um payload #

MétodoFunção
of_add_string (string as_path, string as_value) → longAcrescenta uma CADEIA, com escape automático, ao ARRAY em as_path. O array tem de existir: abra-o primeiro com of_set_raw e um array vazio. Devolve 0, -4 se as_path faltar ou não for um array, -5 se um segmento de as_path estiver vazio ou for um índice 0 num array; uma cadeia nula escreve-se vazia (para um null JSON: of_add_raw(as_path, "null"))
of_add_boolean (string as_path, boolean ab_value) → longAcrescenta um BOOLEANO (true ou false, nunca entre aspas) ao ARRAY em as_path. O array tem de existir: abra-o primeiro com of_set_raw e um array vazio. Devolve 0, -4 se as_path faltar ou não for um array, -5 se um segmento de as_path estiver vazio ou for um índice 0 num array; um valor nulo escreve null
of_add_number (string as_path, long al_value) → longAcrescenta um NÚMERO (cinco sobrecargas: integer, long, longlong, decimal, double — um decimal e um longlong mantêm TODOS os algarismos (os cêntimos de um montante, o último algarismo de um identificador acima de 2^53), e um literal como 690.50 é um decimal, escrito 690.5) ao ARRAY em as_path. O array tem de existir: abra-o primeiro com of_set_raw e um array vazio. Devolve 0, -4 se as_path faltar ou não for um array, -5 se um segmento de as_path estiver vazio ou for um índice 0 num array; um valor nulo escreve null
of_add_raw (string as_path, string as_json) → longAcrescenta um valor JÁ em JSON (um objeto, um array) pelo qual responde ao ARRAY em as_path. O array tem de existir: abra-o primeiro com of_set_raw e um array vazio. Devolve 0, -4 se as_path faltar ou não for um array, -5 se um segmento de as_path estiver vazio ou for um índice 0 num array; um valor nulo ou vazio escreve null. O caminho vazio é a RAIZ: of_load("[]") e depois of_add_raw("", …) constrói um documento que é um array (o corpo de uma chamada de API em lote). Acrescentar muitos elementos seguidos ao mesmo array continua rápido
of_set_array (string as_path, string as_values[]) → longESCREVE um ARRAY inteiro de cadeias em as_path a partir de um array PowerBuilder, cada elemento com escape. Um array vazio escreve um vazio, um elemento nulo uma cadeia vazia. Mesma regra de caminho e mesmos códigos que of_set_string
of_set_members (string as_fragment) → longFunde na RAIZ membros já formados noutro lado, unidos por vírgulas. Um fragmento vazio não escreve nada. Devolve 0, -4 se a raiz do documento não for um objeto
of_clear ( ) → longEsvazia o documento para começar outro objeto com a mesma variável. Devolve 0
of_text ( ) → stringO documento tal como está (compacto): o que construiu (of_add_string, of_add_number...) ou carregou (of_load), após qualquer alteração — a saída única, pronta a enviar, guardar ou reescrever. of_pretty dá a forma indentada. {} se vazio; chamá-lo não esvazia nada

Ler um documento #

MétodoFunção
of_load (string as_json) → longCarrega um texto JSON para leitura. Devolve 0 se bem formado, -5 se o argumento estiver vazio ou em branco (espaços, tabulações, quebras de linha), -4 se não for JSON válido ou aninhar mais de 512 níveis (o documento é então descartado). Analisa em PowerScript puro. Um BOM (U+FEFF) no início, o de um ficheiro guardado em UTF-8 com BOM, é ignorado
of_is_valid ( ) → booleanVerdadeiro quando o objeto contém um documento: o último of_load teve êxito, ou algo foi escrito desde então. Um valor passado a of_set_raw / of_add_raw não é reverificado
of_exists (string as_path) → booleanVerdadeiro quando existe um valor no caminho dado — distingue um valor presente mas vazio de um ausente
of_type (string as_path) → stringO tipo JSON no caminho: object, array, string, number, boolean, null; vazio se ausente
of_get_string (string as_path) → stringO valor no caminho, como texto: uma string volta descodificada, um número/booleano/null como texto, um objeto ou array como JSON em bruto (recarregável com of_load); uma chave escrita duas vezes lê-se na sua PRIMEIRA ocorrência
of_get_number (string as_path) → doubleO número no caminho, como double — o ponto decimal é respeitado em qualquer máquina (2.5 é 2,5, não 2). 0 se ausente; o expoente é resolvido (1e-7, 2.5E+3) e mantêm-se 17 algarismos significativos, zeros iniciais do expoente incluídos. Para um montante ou um identificador que deve manter todos os algarismos: of_get_decimal ou of_get_longlong
of_get_decimal (string as_path) → decimalO número no caminho, como decimal, reconstruído a partir do TEXTO do número e nunca através de um double: 12345678901234.56 volta com os seus cêntimos, 2.5E-3 vale 0.0025. No máximo 28 algarismos significativos. 0 se ausente, se o valor não for um número, ou além do que um decimal comporta
of_get_longlong (string as_path) → longlongO número no caminho, como inteiro de 64 bits, reconstruído a partir do seu texto e nunca através de um double: um identificador de base de dados como 9007199254740993 volta inteiro. As casas decimais são cortadas (2.9 dá 2). 0 se ausente, se o valor não for um número, ou fora do intervalo de um longlong
of_get_boolean (string as_path) → booleanO booleano no caminho: verdadeiro apenas para o literal JSON true
of_count (string as_path) → longO número de membros do objeto, ou de elementos do array, no caminho. Devolve -1 se o valor for escalar ou ausente (distingue um array vazio, 0, de um em falta, -1). Com of_name percorre-se um objeto; um array percorre-se pelo seu índice no caminho (rows/1, rows/2…)
of_name (string as_path, long al_index) → stringO nome do membro n.º al_index (a partir de 1) do objeto no caminho — para ler as chaves de um objeto de forma desconhecida. Com of_count, percorre o objeto
of_get_array (string as_path, ref string as_values[]) → longTodos os elementos do array no caminho, por ordem, em as_values (esvaziado antes) — cada um como of_get_string o lê: uma string volta descodificada, um número ou um booleano como texto, null como "", um objeto ou um array como JSON em bruto (a carregar com of_load noutro n_pbt_json). "" é a raiz. Devolve o número de elementos (0 para um array vazio), -4 quando não há um array no caminho (nada, um objeto, um escalar), -5 com um segmento vazio (a//b)
of_pretty ( ) → stringO documento — carregado ou construído — reindentado para leitura (várias linhas, tabulações) — um log, uma caixa de texto. Vazio se não houver nenhum
of_pretty (long al_indent) → stringO documento — carregado ou construído — reindentado com al_indent espaços por nível (2 e 4 são as larguras habituais). 0 escreve-o compacto, numa linha e sem espaços: o texto mais pequeno para guardar ou enviar. Vazio se não houver documento, ou se al_indent for negativo, superior a 16 ou null. of_pretty() sem argumento mantém as tabulações
// Local variables
n_pbt_json  lnv_json
string      ls_tags[]
string      ls_compact
long        ll_count

// Read every element of an array at once, then store the document on one line
lnv_json.of_load(/*json*/ '{"customer":{"name":"Ada","tags":["vip","b2b"]}}')
ll_count = lnv_json.of_get_array(/*path*/ "customer/tags", /*values*/ ls_tags)   // 2 : vip, b2b

// The document on one line, without a space : the smallest text to store
ls_compact = lnv_json.of_pretty(/*indent*/ 0)

Modificar um documento #

O lado de escrita altera o documento carregado no lugar, depois of_text devolve o resultado (compacto) — o que se reescreve. Os setters substituem o valor no caminho, ou acrescentam a última chave quando falta a um objeto pai. Cada um devolve 0, -4 quando o pai falta ou é do tipo errado, -5 num caminho vazio ou um índice 0 num array. Um array encontrado no caminho atravessa-se por um índice que EXISTE (items/1/qty acrescenta qty ao primeiro elemento); só uma chave de objeto é criada. Um valor null (número, booleano, JSON em bruto vazio) escreve-se null.

MembroFunção
of_set_string (string as_path, string as_value) → longESCREVE uma cadeia em as_path, com escape automático. O caminho pode ter VÁRIOS níveis (a/b/c): os que faltam são criados como OBJETOS, e um documento VAZIO passa a sê-lo — escrever É construir. Um valor já presente é substituído, onde quer que esteja. Devolve 0, -4 se um nível do caminho for um escalar, ou um array sem esse índice (um array atravessa-se por um índice existente: items/1/qty), -5 com um caminho vazio, um segmento vazio ou um índice 0 num array. Uma cadeia nula escreve-se vazia; para um null JSON: of_set_raw(as_path, "null")
of_set_number (string as_path, long al_value) → longESCREVE um NÚMERO em as_path, o ponto decimal forçado. Cinco sobrecargas: integer, long, longlong, decimal, double — um decimal e um longlong mantêm TODOS os algarismos (os cêntimos de um montante, o último algarismo de um identificador acima de 2^53), e um literal como 690.50 é um decimal, escrito 690.5. Mesma regra de caminho e mesmos códigos que of_set_string; um valor nulo escreve null
of_set_boolean (string as_path, boolean ab_value) → longESCREVE um BOOLEANO em as_path: true ou false, nunca entre aspas. Mesma regra de caminho e mesmos códigos que of_set_string; um valor nulo escreve null
of_set_raw (string as_path, string as_json) → longESCREVE em as_path um valor JÁ em JSON — um objeto aninhado, um array, null — tal como está: responde por ele. É também assim que se ABRE um array antes de of_add_*. Mesma regra de caminho e mesmos códigos que of_set_string; um valor nulo ou vazio escreve null
of_remove (string as_path) → longRemove o valor no caminho — um membro de objeto (a sua chave e uma vírgula vão com ele) ou um elemento de array; o resultado permanece válido. Devolve 0, -4 se nada estiver lá, -5 com um caminho vazio, um segmento vazio ou um índice 0 num array
// Local variables
n_pbt_json  lnv_json

// Load, edit in place, then read back the ONE document with of_text
lnv_json.of_load(/*json*/ '{"name":"Ada","active":false}')
lnv_json.of_set_string(/*path*/ "name", /*value*/ "Grace")   // replace
lnv_json.of_set_boolean(/*path*/ "active", /*value*/ true)
lnv_json.of_set_number(/*path*/ "count", /*value*/ 3)        // added : the key was absent

// lnv_json.of_text() -> {"name":"Grace","active":true,"count":3}

Âmbito. O JSON analisa-se em PowerScript puro, sem página nem motor: n_pbt_json continua autoinstantiate e funciona em todo o lado, PowerBuilder 10 incluído. Para XML, veja xml (que assenta no motor); para mostrar um JSON como árvore recolhível, veja jsontree.

← Referência dos componentes · Índice do guia