Converta chaves com pontos em JSON aninhado
Reconstrua um registro aninhado a partir de nomes planos com pontos: user.contact.email volta para dentro de contact, dentro de user, enquanto active e a pontuação de 42 ficam no nível de cima. No exemplo, 5 entradas planas são processadas. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Roda direto no seu navegador. Grátis, sem cadastro — seus dados não são enviados para lugar nenhum.
Esta ferramenta determinística expande cada chave separada por pontos, preserva strings, números, booleanos, valores nulos, arrays e objetos e informa caminhos ambíguos em vez de sobrescrever dados silenciosamente. Ela é útil quando variáveis de ambiente, exportações de formulários, configurações, ferramentas de análise ou consultas de banco de dados geram registros planos que precisam ser restaurados antes da validação ou do processamento.
Converta caminhos com pontos em um documento aninhado
Cada nome de propriedade é interpretado como um caminho cujos segmentos são separados por pontos. Por exemplo, account.profile.name vira a propriedade name dentro de profile, que está dentro de account. Uma chave sem ponto permanece no nível superior.
Os valores não são convertidos: um número continua sendo número, false permanece booleano, null continua nulo e os arrays mantêm ordem e conteúdo. O resultado contém o documento reconstruído em json e uma contagem keys que mostra quantas propriedades planas foram processadas. Segmentos que parecem números são tratados como chaves normais de objeto, e não como índices de array; assim, a transformação não inventa uma coleção que a entrada não declarou.
O processo é determinístico, não usa rede e não depende de localidade, horário ou efeitos da ordem de inserção.
Detecte caminhos conflitantes antes de perder dados
A reconstrução se torna perigosa quando uma chave afirma que um caminho é um valor final e outra exige que o mesmo caminho seja um objeto. A capacidade rejeita essa entrada com um erro de entrada inválida, em vez de escolher a propriedade visitada por último. Ela também rejeita colisões dentro de objetos explícitos.
Objetos explícitos podem receber descendentes com pontos quando as propriedades existentes não entram em conflito; portanto, settings definido como objeto pode coexistir com settings.theme como novo membro. Chaves vazias, pontos iniciais ou finais e pontos duplos são recusados porque criam segmentos sem nome. Os nomes especiais __proto__, prototype e constructor também são bloqueados em todos os níveis, inclusive em objetos fornecidos, evitando surpresas relacionadas a protótipos.
Essas verificações tornam as falhas visíveis e garantem que cada posição de uma saída válida tenha uma única origem inequívoca.
Perguntas frequentes
Quanto custa?
Você também pode executar a transformação no navegador nesta página.
Segmentos numéricos viram arrays?
Não. Cada segmento é preservado como chave de objeto, evitando suposições sobre índices ou identificadores.
Os tipos dos valores são preservados?
Sim. Strings, números finitos, booleanos, null, arrays e objetos são copiados sem conversão de tipo.
Uma chave pode conter um segmento vazio?
Não. Chaves vazias, pontos duplos e pontos iniciais ou finais são rejeitados por criarem caminhos ambíguos.
O que acontece se dois nomes entram em conflito, como user e user.name?
A entrada é recusada com um erro claro em vez de ficar com o nome que apareceu por último. Um mesmo lugar não pode ser ao mesmo tempo um valor final e um grupo, então cada posição de um resultado correto tem uma única origem.
Os tipos dos valores são mantidos?
Sim, nada é convertido por conta própria: um número continua número, falso continua falso, um valor nulo continua nulo e as listas mantêm a ordem e o conteúdo. Um texto que tem pontos também não é dividido.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/data/unflatten-to-json \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"flat":{"user.name":"Ada","user.contact.email":"ada@example.com","active":true}}'const res = await fetch("https://api.kit.forhosting.com/data/unflatten-to-json", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"flat": {
"user.name": "Ada",
"user.contact.email": "ada@example.com",
"active": true
}
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/unflatten-to-json",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"flat": {
"user.name": "Ada",
"user.contact.email": "ada@example.com",
"active": true
}
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/unflatten-to-json", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"flat":{"user.name":"Ada","user.contact.email":"ada@example.com","active":true}}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"flat":{"user.name":"Ada","user.contact.email":"ada@example.com","active":true}}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/unflatten-to-json", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"flat": {
"user.name": "Ada",
"user.contact.email": "ada@example.com",
"active": true
}
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.unflatten_to_json",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_mb | 25 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Converta um objeto JSON plano, como {"account.name":"Ada"}, na estrutura aninhada que sua aplicação realmente espera.
Converta caminhos com pontos em um documento JSON comum
Forneça um objeto JSON no campo flat. Isso mantém a saída estável para configurações, aliases de banco de dados e formulários. Use valores JSON válidos e coloque os nomes das propriedades entre aspas.
Detecte caminhos conflitantes antes de perder dados
Uma entrada com user como string e user.name como outro valor não consegue representar os dois fatos em uma única estrutura JSON.
Use o resultado em migrações e pipelines de aplicações
Chaves planas aparecem com frequência nas fronteiras entre sistemas. Em lotes, chame a capacidade uma vez por registro plano, pois a unidade de cobrança é um item e cada resposta descreve exatamente um documento reconstruído. Pontos em valores de texto são seguros; somente nomes de propriedades viram caminhos. Consultas SQL costumam produzir aliases como customer.address.city; plataformas de logs e análise achatam eventos aninhados para indexação; formulários HTML codificam controles agrupados com nomes pontuados; e sistemas de implantação representam configurações estruturadas como variáveis separadas. Coloque esta conversão logo após ler o formato de fronteira e antes de aplicar um esquema JSON aninhado. Assim, uma falha de validação aponta para o registro de origem, em vez de deixar uma estrutura incompleta avançar pelo pipeline. O executor no navegador é prático para inspecionar um registro sem programar, enquanto a API começa em US$ 0,002 para automação. Como os valores são copiados sem interpretar strings ou inferir tipos, analise antes as strings que contenham JSON intencionalmente.
Casos de integração
Restaure aliases de consultas
Transforme colunas como customer.name e customer.address.city no objeto customer aninhado esperado por uma API.
Prepare configurações para validação
Reconstrua ajustes aninhados a partir de chaves planas antes de aplicar um esquema JSON ou valores padrão.
Normalize formulários e eventos
Converta nomes pontuados de formulários, logs ou exportações analíticas em JSON comum para processamento posterior.
Perguntas técnicas
O que ocorre quando uma chave é prefixo de outra?
Se o prefixo contiver um valor que não seja objeto, a solicitação falhará com invalid_input porque os dois caminhos não podem coexistir.