Codificação JSON
Codifique tabelas Lua para JSON e decodifique strings JSON para valores Lua. Inclui validação JSON Schema para verificação de dados e aplicação de contratos de API.
Carregamento
local json = require("json")
Codificação
Codificar Valor
Codifica um valor Lua em uma string JSON.
-- Valores simples
json.encode("hello") -- '"hello"'
json.encode(42) -- '42'
json.encode(true) -- 'true'
json.encode(nil) -- 'null'
-- Arrays (chaves numericas sequenciais)
json.encode({1, 2, 3}) -- '[1,2,3]'
json.encode({"a", "b"}) -- '["a","b"]'
-- Objetos (chaves string)
local user = {name = "Alice", age = 30}
json.encode(user) -- '{"name":"Alice","age":30}'
-- Estruturas aninhadas
local order = {
id = "ord-123",
items = {
{sku = "ABC", qty = 2},
{sku = "XYZ", qty = 1}
},
total = 99.50
}
json.encode(order)
-- '{"id":"ord-123","items":[{"sku":"ABC","qty":2},{"sku":"XYZ","qty":1}],"total":99.5}'
| Parâmetro | Tipo | Descrição |
|---|---|---|
value |
any | Valor Lua para codificar |
Retorna: string, error
Regras de codificação:
nilse tornanull- Tabelas vazias se tornam
[](ou{}se criadas com chaves string) - Tabelas com chaves sequenciais baseadas em 1 se tornam arrays
- Tabelas com chaves string se tornam objetos
- Chaves mistas numericas e string causam erro
- Arrays esparsos (gaps nos indices) causam erro
- Numeros Inf/NaN se tornam
null - Referências recursivas de tabela causam erro
- Profundidade maxima de aninhamento e 128 niveis
Decodificação
Decodificar String
Decodifica uma string JSON em um valor Lua.
-- Parse de objeto
local user, err = json.decode('{"name":"Bob","active":true}')
if err then
return nil, err
end
print(user.name) -- "Bob"
print(user.active) -- true
-- Parse de array
local items = json.decode('[10, 20, 30]')
print(items[1]) -- 10
print(#items) -- 3
-- Parse de dados aninhados
local response = json.decode([[
{
"status": "ok",
"data": {
"users": [
{"id": 1, "name": "Alice"},
{"id": 2, "name": "Bob"}
]
}
}
]])
print(response.data.users[1].name) -- "Alice"
-- Tratar erros
local data, err = json.decode("not valid json")
if err then
print(err:kind()) -- "INTERNAL"
print(err:message()) -- detalhes do erro de parse
end
| Parâmetro | Tipo | Descrição |
|---|---|---|
str |
string | String JSON para decodificar |
Retorna: any, error
Validação de Schema
Validar Valor
Valida um valor Lua contra um JSON Schema. Use para aplicar contratos de API ou validar entrada do usuário.
-- Definir um schema
local user_schema = {
type = "object",
properties = {
name = {type = "string", minLength = 1},
email = {type = "string", format = "email"},
age = {type = "integer", minimum = 0, maximum = 150}
},
required = {"name", "email"}
}
-- Dados validos passam
local valid, err = json.validate(user_schema, {
name = "Alice",
email = "alice@example.com",
age = 30
})
print(valid) -- true
-- Dados inválidos falham com detalhes
local valid, err = json.validate(user_schema, {
name = "",
email = "not-an-email"
})
if not valid then
print(err:message()) -- detalhes do erro de validação
end
-- Schema também pode ser uma string JSON
local schema_json = '{"type":"number","minimum":0}'
local valid = json.validate(schema_json, 42)
| Parâmetro | Tipo | Descrição |
|---|---|---|
schema |
table ou string | Definição de JSON Schema |
data |
any | Valor para validar |
Retorna: boolean, error
Schemas sao cacheados por hash de conteudo para performance.
Validar String JSON
Valida uma string JSON contra um schema sem decodificar primeiro. Util quando voce precisa validar antes do parse.
local schema = {
type = "object",
properties = {
action = {type = "string", enum = {"create", "update", "delete"}}
},
required = {"action"}
}
-- Validar JSON raw do corpo da requisição
local body = '{"action":"create","data":{}}'
local valid, err = json.validate_string(schema, body)
if not valid then
return nil, errors.new("INVALID", "Invalid request: " .. err:message())
end
-- Agora seguro para decodificar
local request = json.decode(body)
| Parâmetro | Tipo | Descrição |
|---|---|---|
schema |
table ou string | Definição de JSON Schema |
json_str |
string | String JSON para validar |
Retorna: boolean, error
Erros
| Condição | Tipo | Retentável |
|---|---|---|
| Referência recursiva de tabela | errors.INTERNAL |
não |
| Array esparso (gaps nos indices) | errors.INTERNAL |
não |
| Tipos de chave mistos na tabela | errors.INTERNAL |
não |
| Aninhamento excede 128 niveis | errors.INTERNAL |
não |
| Sintaxe JSON invalida | errors.INTERNAL |
não |
| Compilação de schema falhou | errors.INVALID |
não |
| Validação falhou | errors.INVALID |
não |
Veja Error Handling para trabalhar com erros.