Boa noite Adalberto,
por gentileza corrigir a biblioteca json.pris
linha 92
senaose kind == 'boolean' entao
para
senaose kind == 'booleano' entao
Valeu Rafael
Como estou meio parado em relação à programação, vai demorar um pouco para eu atualizar os downloads.
Então deixo aqui o código corrigido:
local json = {}
// Internal functions.
local funcao kind_of(obj)
se tipo(obj) <> 'tabela' entao retorne tipo(obj) fim
local i = 1
para _ em pares(obj) inicio
se obj[i] <> nulo entao i = i + 1 senao retorne 'tabela' fim
fim
se i == 1 entao retorne 'tabela' senao retorne 'array' fim
fim
local funcao escape_str(s)
local in_char = {'\\', '"', '/', '\b', '\f', '\n', '\r', '\t'}
local out_char = {'\\', '"', '/', 'b', 'f', 'n', 'r', 't'}
para i, c em ipares(in_char) inicio
s = s:troque(c, '\\' .. out_char[i])
fim
retorne s
fim
// Returns pos, did_find; there are two cases:
// 1. Delimiter found: pos = pos after leading space + delim; did_find = verdadeiro.
// 2. Delimiter not found: pos = pos after leading space; did_find = falso.
// This throws an error if err_if_missing is true and the delim is not found.
local funcao skip_delim(str, pos, delim, err_if_missing)
pos = pos + #str:separe('^%s*', pos)
se str:corte(pos, pos) <> delim entao
se err_if_missing entao
retorne falso, ('Esperado ' .. delim .. ' próximo da posição ' .. pos)
fim
retorne pos, falso
fim
retorne pos + 1, verdadeiro
fim
// Expects the given pos to be the first character after the opening quote.
// Returns val, pos; the returned pos is after the closing quote character.
local funcao parse_str_val(str, pos, val)
val = val ou ''
local early_end_error = 'Fim de input encontrado durante a análise da string.'
se pos > #str entao retorne falso, (early_end_error) fim
local c = str:corte(pos, pos)
se c == '"' entao retorne val, pos + 1 fim
se c <> '\\' entao retorne parse_str_val(str, pos + 1, val .. c) fim
// We must have a \ character.
local esc_map = {b = '\b', f = '\f', n = '\n', r = '\r', t = '\t'}
local nextc = str:corte(pos + 1, pos + 1)
se nao nextc entao retorne falso, (early_end_error) fim
retorne parse_str_val(str, pos + 2, val .. (esc_map[nextc] ou nextc))
fim
// Returns val, pos; the returned pos is after the number's final character.
local funcao parse_num_val(str, pos)
local num_str = str:separe('^-?%d+%.?%d*[eE]?[+-]?%d*', pos)
local val = convnumero(num_str)
se nao val entao retorne falso, ('Erro ao analisar numero na posição ' .. pos .. '.') fim
retorne val, pos + #num_str
fim
// Public values and functions.
funcao json.cod(obj, as_key)
local s = {} // We'll build the string as an array of strings to be concatenated.
local kind = kind_of(obj) // This is 'array' if it's an array or type(obj) otherwise.
se kind == 'array' entao
se as_key entao retorne falso, ('Não é possível codificar uma matriz como uma chave.') fim
s[#s + 1] = '['
para i, val em ipares(obj) inicio
se i > 1 entao s[#s + 1] = ', ' fim
s[#s + 1] = json.cod(val)
fim
s[#s + 1] = ']'
senaose kind == 'tabela' entao
se as_key entao retorne falso, ('Não é possível codificar tabela como uma chave.') fim
s[#s + 1] = '{'
para k, v em pares(obj) inicio
se #s > 1 entao s[#s + 1] = ', ' fim
s[#s + 1] = json.cod(k, verdadeiro)
s[#s + 1] = ':'
s[#s + 1] = json.cod(v)
fim
s[#s + 1] = '}'
senaose kind == 'string' entao
retorne '"' .. escape_str(obj) .. '"'
senaose kind == 'numero' entao
se as_key entao retorne '"' .. convstring(obj) .. '"' fim
retorne convstring(obj)
senaose kind == 'booleano' entao
retorne convstring(obj)
senaose kind == 'nulo' entao
retorne 'null'
senao
retorne falso, ('Tipo não compatível com json: ' .. kind .. '.')
fim
retorne tabela.concat(s)
fim
json.null = {} // This is a one-off tabela to represent the null value.
funcao json.decod(str, pos, end_delim)
pos = pos ou 1
se pos > #str entao retorne falso , ('Fim inesperado de input') fim
local pos = pos + #str:separe('^%s*', pos) // Skip whitespace.
local first = str:corte(pos, pos)
se first == '{' entao // Parse an object.
local obj, key, delim_found = {}, verdadeiro, verdadeiro
pos = pos + 1
enquanto verdadeiro inicio
key, pos = json.decod(str, pos, '}')
se key == nulo entao retorne obj, pos fim
se nao delim_found entao retorne falso, ('Falta vírgula entre itens objetos.') fim
pos = skip_delim(str, pos, ':', verdadeiro) // true -> error if missing.
obj[key], pos = json.decod(str, pos)
pos, delim_found = skip_delim(str, pos, ',')
fim
senaose first == '[' entao // Parse an array.
local arr, val, delim_found = {}, verdadeiro, verdadeiro
pos = pos + 1
enquanto verdadeiro inicio
val, pos = json.decod(str, pos, ']')
se val == nulo entao retorne arr, pos fim
se nao delim_found entao retorne falso, ('Falta vírgula separando itens da matriz.') fim
arr[#arr + 1] = val
pos, delim_found = skip_delim(str, pos, ',')
fim
senaose first == '"' entao // Parse a string.
retorne parse_str_val(str, pos + 1)
senaose first == '-' ou first:separe('%d') entao // Parse a number.
retorne parse_num_val(str, pos)
senaose first == end_delim entao // End of an object or array.
retorne nulo, pos + 1
senao // Parse true, false, or null.
local literals = {['true'] = verdadeiro, ['false'] = falso, ['null'] = json.NULO}
para lit_str, lit_val em pares(literals) inicio
local lit_end = pos + #lit_str - 1
se str:corte(pos, lit_end) == lit_str entao retorne lit_val, lit_end + 1 fim
fim
local pos_info_str = 'posição ' .. pos .. ': ' .. str:corte(pos, pos + 10)
retorne falso, 'Sintaxe json inválida em ' .. pos_info_str
fim
fim
local es_abra = es.abra;
funcao json.decod_arquivo(arq)
local a, err = es_abra(arq,'leitura');
se nao a entao retorne falso, err fim
local str = a:leia'*t'; //lê todo o arquivo.
a:feche();
retorne json.decod(str); //retorna a tabela.
fim
funcao json.cod_arquivo(arq, tab)
se tipo(tab)<> 'tabela' entao
retorne falso, ('\n\nErro arg #2, espera-se tabela ao invés de ' .. tipo(tab) .. '\n\n');
fim
local str = json.cod(tab);
local a, err = es_abra(arq,'escrita');
se nao a entao retorne falso, err fim
a:escreva(str);
a:feche();
retorne verdadeiro;
fim
retorne json;