Reparar JSON
Conserta vírgulas sobrando, aspas simples, comentários e literais de Python, listando cada alteração.
Nada do que você cola sai do seu navegador. A lista de permissões connect-src transforma isso em uma garantia do navegador, e não em uma promessa. Confira você mesmo
O reparo pega algo que é quase JSON e torna válido. Vírgulas sobrando, aspas simples, chaves sem aspas, comentários, literais de Python, aspas tipográficas, colchetes não fechados, espaços invisíveis.
A saída não é a parte interessante. O registro de alterações é. Uma ferramenta de reparo que reescreve o seu payload em silêncio é pior do que nenhuma, porque você não consegue saber o que ela decidiu por você. Cada alteração aparece com linha e coluna, e as que envolveram um julgamento aparecem separadas das que não envolveram.
O que ele conserta sem precisar adivinhar
Estes casos têm exatamente uma interpretação sensata, então são aplicados sem mais comentário além da entrada no registro.
- Vírgulas sobrando e duplicadas
- Removidas. Legais em JavaScript e JSON5, nunca em JSON.
- Strings com aspas simples
- Convertidas para aspas duplas, com o conteúdo reescapado para que um apóstrofo interno não estrague o resultado.
- Chaves sem aspas
- Recebem aspas. O JavaScript aceita identificadores soltos como chaves; o JSON não.
- Comentários
- Removidos, tanto na forma // quanto /* */.
- Literais de Python
- True, False e None viram true, false e null.
- Aspas tipográficas
- As aspas curvas que o corretor automático produz viram aspas ASCII retas.
- Espaço em branco inválido
- Espaços inquebráveis e parentes viram espaços comuns; caracteres de largura zero são removidos.
- Marca de ordem de bytes
- Retirada do início do documento.
- Vírgulas e dois-pontos faltando
- Inseridos onde a gramática deixa a intenção sem ambiguidade.
- Caracteres de controle crus em strings
- São escapados, então uma quebra de linha literal vira \n.
O que ele marca como julgamento
Estes mudam o significado, e nenhum padrão está certo para todo mundo. São aplicados, listados à parte e configuráveis.
- Zeros à esquerda
- O padrão é colocar o valor entre aspas: 02134 vira a string "02134". Em dados reais, zeros à esquerda quase sempre são um CEP, um número de conta ou um SKU, e removê-los destrói o valor em silêncio. Se for mesmo um número, mude a política para converter e ele vira 2134.
- NaN, Infinity e undefined
- Convertidos para null, que é o que a maioria dos codificadores coloca no lugar. O Python emite NaN e Infinity pelo json.dumps por padrão; passe allow_nan=False para pegar isso na origem.
- Palavras soltas usadas como valor
- Recebem aspas como string. {"status": pending} vira {"status": "pending"}, o que costuma estar certo e de vez em quando não está.
- Colchetes não fechados
- São fechados no fim do documento. Se o arquivo estava truncado em vez de mal digitado, isso produz um JSON válido com dados faltando, então a alteração é sempre listada.
- NDJSON
- Vários valores completos, um por linha, são envolvidos em um array por padrão. Você também pode manter só o primeiro registro, ou deixar a entrada como está.
O que ele não vai fazer
Ele não inventa estrutura. Se a entrada não estiver perto o bastante de JSON, o reparo falha e diz quais erros não conseguiu resolver, em vez de produzir algo que faz o parsing mas não significa nada.
Ele também roda um número limitado de passadas. Cada passada pode revelar um problema que a anterior escondia, mas o processo converge em vez de entrar em laço.
How to do this in code
Fazendo isso em código, com a ressalva honesta de que fazer parsing tolerante no consumidor normalmente significa que algo lá atrás está produzindo JSON ruim e vai continuar produzindo.
py Python, repr de dict
ast.literal_eval só avalia estruturas literais, então, ao contrário do eval, não consegue executar código arbitrário.
import ast, json
# A Python dict printed with str() or print() is not JSON.
text = "{'name': 'Priya', 'active': True}"
value = ast.literal_eval(text) # safe: literals only, no eval
clean = json.dumps(value) # '{"name": "Priya", "active": true}' js JavaScript, JSON5
JSON5 é um superconjunto com uma especificação de verdade, o que o torna um alvo melhor do que um parser tolerante improvisado.
import JSON5 from 'json5';
// Accepts comments, trailing commas, unquoted keys, single
// quotes, hex numbers and more.
const value = JSON5.parse(text);
const strict = JSON.stringify(value); ts TypeScript, JSONC
import { parse } from 'jsonc-parser';
// What VS Code uses for its own settings files: comments and
// trailing commas, and nothing else.
const errors: ParseError[] = [];
const value = parse(text, errors); sh Shell
# Strip comments and trailing commas with jq's relaxed reader
jq --args . <<< "$text"
# Or normalise a JSON5 file
npx json5 -c config.json5 > config.json Perguntas frequentes
- O reparo chega a alterar os meus dados?
- Só das formas listadas em julgamentos, e cada uma delas aparece no registro de alterações com linha e coluna. Os reparos seguros mexem apenas na sintaxe. Se você discordar de um julgamento, mude a configuração e rode de novo.
- Por que 02134 vira string e não o número 2134?
- Porque colocar entre aspas não perde nada e cortar perde. Em dados reais, zeros à esquerda quase sempre são significativos, e um conversor que silenciosamente transformasse um CEP em um número menor estaria fazendo exatamente o tipo de estrago silencioso que este site existe para evitar. A opção de cortar está a um clique.
- Ele diz que não conseguiu reparar o meu documento. E agora?
- Passe pelo validador. O reparo só trata problemas com correção sem ambiguidade; um documento com estrutura realmente irrecuperável precisa de uma pessoa para decidir o que era a intenção.