Codificação JSON
Codificação JSON
Seção intitulada “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
Seção intitulada “Carregamento”local json = require("json")Codificação
Seção intitulada “Codificação”Codificar Valor
Seção intitulada “Codificar Valor”Codifica um valor Lua em uma string JSON.
-- Valores simplesjson.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 aninhadaslocal 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
Seção intitulada “Decodificação”Decodificar String
Seção intitulada “Decodificar String”Decodifica uma string JSON em um valor Lua.
-- Parse de objetolocal user, err = json.decode('{"name":"Bob","active":true}')if err then return nil, errendprint(user.name) -- "Bob"print(user.active) -- true
-- Parse de arraylocal items = json.decode('[10, 20, 30]')print(items[1]) -- 10print(#items) -- 3
-- Parse de dados aninhadoslocal response = json.decode([[{ "status": "ok", "data": { "users": [ {"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"} ] }}]])print(response.data.users[1].name) -- "Alice"
-- Tratar erroslocal data, err = json.decode("not valid json")if err then print(err:kind()) -- "INTERNAL" print(err:message()) -- detalhes do erro de parseend| Parâmetro | Tipo | Descrição |
|---|---|---|
str | string | String JSON para decodificar |
Retorna: any, error
Validação de Schema
Seção intitulada “Validação de Schema”Validar Valor
Seção intitulada “Validar Valor”Valida um valor Lua contra um JSON Schema. Use para aplicar contratos de API ou validar entrada do usuário.
-- Definir um schemalocal 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 passamlocal valid, err = json.validate(user_schema, { name = "Alice", email = "alice@example.com", age = 30})print(valid) -- true
-- Dados inválidos falham com detalheslocal valid, err = json.validate(user_schema, { name = "", email = "not-an-email"})if not valid then print(err:message()) -- detalhes do erro de validaçãoend
-- Schema também pode ser uma string JSONlocal 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
Seção intitulada “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çãolocal 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 decodificarlocal 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
| 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.