Ir para o conteúdo
jsonbeautifiers
Português

Reparar JSON

Conserta vírgulas sobrando, aspas simples, comentários e literais de Python, listando cada alteração.

Filtrar com JSONPath

Sintaxe da RFC 9535. O resultado substitui o painel a partir do qual você abriu esta janela.

 

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.