Reparar JSON quebrado
Cole o JSON que não abre: uma resposta de chat com o bloco de código em volta, um arquivo de configuração com comentários, um print do Python com True e None, um log com um objeto por linha. Sai um JSON válido, com a lista de cada correção e do ponto onde ela foi feita. Se o texto estava cortado, a página fecha o JSON e avisa isso com clareza. Nada sai do seu navegador.
De onde vem o JSON quebrado
Quase nunca de um programa: programas escrevem JSON correto. Ele vem de uma resposta de chat, que o coloca dentro de um bloco de código com uma frase antes e outra depois, e de vez em quando acrescenta um comentário para explicar um campo para você. Vem de um arquivo de configuração escrito à mão, em que a vírgula depois do último item e os comentários são normais porque o editor os aceita. Vem de um print do Python, que escreve aspas simples e True, False e None. E vem de um log, em que cada linha é um objeto à parte, muitas vezes com a hora ou o nome do serviço na frente, e o arquivo inteiro não é um JSON só, mas vários em sequência.
Em todos esses casos o programa que precisa ler o JSON para no primeiro erro e diz algo como “Unexpected token”. Corrigir um erro à mão é fácil; quarenta espalhados por duas mil linhas, rodando de novo a cada vez, não é. Aqui você cola tudo, até com a frase do chat em volta.
Cada correção é listada, com a linha e a coluna
Uma ferramenta de reparo que devolve um JSON válido sem dizer em que mexeu é uma caixa-preta: o arquivo abre agora, mas você não sabe se os dados que havia nele continuam lá. Aqui cada mudança tem uma linha na lista, com o ponto exato no texto que você colou: linha 14, coluna 3, vírgula final removida.
As correções não são todas iguais, e a lista deixa isso claro. Remover um comentário, uma vírgula sobrando ou o bloco de markdown não muda nenhum dado. Outras são decisões, e vêm marcadas como tal: NaN e Infinity viram null porque o JSON não tem como escrevê-los, e o JSON.stringify faz o mesmo; um número escrito 007 vira 7, e se era um CEP aqueles zeros eram dados; vários objetos em sequência viram uma lista, porque um arquivo JSON guarda um único valor.
O caso perigoso: JSON cortado no meio
Acontece o tempo todo com chats: a resposta é longa, o modelo chega ao limite e para no meio de uma lista, muitas vezes no meio de uma palavra. O texto que você tem não está errado, está incompleto, e esses são dois problemas diferentes. Recolocar os fechamentos que faltam o torna válido, e isso é feito aqui; mas um JSON fechado assim guarda menos dados que o original, e um programa que o lê não tem como perceber.
Por isso, nesse caso a página não diz apenas “válido”. Ela diz que o texto está cortado, em que linha e coluna ele termina, dentro de quê (um texto, um número, uma lista ainda aberta), quais fechamentos acrescentou e que pedaço removeu. E a regra é rígida: para fechá-lo, o que se acrescenta são só aspas, colchetes e chaves. O que ficou pela metade e não pode ser fechado sem inventar algo é removido: o nome de uma chave partido ao meio, porque uma chave cortada é outra chave; um “tru” que só poderia ser true; uma vírgula pendurada.
Um exemplo com números: uma lista de 50 produtos que para no meio do nome do trigésimo oitavo sai como uma lista de 38 itens, o último com o nome cortado, e a página o sinaliza como valor cortado. Os outros doze não estão lá e ninguém consegue reconstruí-los: você precisa pedir ao chat que continue, ou que responda em várias partes. O arquivo que você baixa nesse caso leva a palavra incompleto no nome, para você não confundi-lo com um arquivo bom.
Aspas: retas, curvas e simples
As aspas curvas chegam quando o JSON passa pelo Word, por um e-mail ou pelo teclado do celular, que as “embeleza” enquanto você digita. Onde fazem papel de delimitador, elas viram retas. Dentro de um texto, ao contrário, são conteúdo e ficam como estão: uma frase com aspas tipográficas não deve sair diferente de como entrou. O mesmo vale para // e # dentro de um endereço da web, que não são comentários, e para a palavra True dentro de uma frase.
As aspas simples são as do Python e do JavaScript. Aqui também se reconhece o apóstrofo dentro do texto, o de don't: uma aspa simples só fecha a string se o que vem depois pode vir depois de um valor, ou seja, uma vírgula, dois-pontos, um colchete ou o fim da linha. As aspas retas dentro de um texto sem a barra invertida que as protege, por outro lado, não são adivinhadas: aí a página para e diz onde.
As barras invertidas seguem a mesma ideia. Se um texto tem ao menos uma que o JSON não conhece, como em C:\Users\anna\new, esse texto foi escrito por uma pessoa, e todas as suas barras invertidas continuam barras invertidas de verdade: até a que vem antes de new, que o JSON leria como uma quebra de linha.
O que continua igual, e como se confere
Um JSON que já é válido sai com o mesmo valor, só formatado. Parece óbvio e não é: muitas ferramentas passam pelo JSON.parse, que transforma um identificador como 12345678901234567890 em 12345678901234567000, e um identificador arredondado é outro identificador. Aqui os números ficam exatamente como foram escritos, 1.50 inclusive. A ordem das chaves também continua, e as chaves repetidas ficam as duas, sinalizadas: quase todo programa guarda só a última, e escolher qual descartar cabe a você.
O teste desta ferramenta não é um punhado de exemplos escolhidos à mão. Um programa gera centenas de documentos JSON válidos, quebra-os de maneiras conhecidas anotando onde pôs cada defeito, e exige que o valor reparado seja exatamente o de partida, relido pela biblioteca padrão do Python, e que a lista nomeie precisamente esses defeitos, nesses pontos. Nos textos cortados ele exige o maior pedaço que pode ser mantido: nada completo jogado fora, e os fechamentos que faltavam, nem um a mais.
O que ela não faz
Ela não adivinha. Uma palavra sem aspas onde se espera um valor, como status: active; uma data ou uma versão sem aspas, como 2024-01-15 ou 3.5.1, que não são números; um colchete ou uma chave fechados com o símbolo errado, ou um fechamento a mais com mais dados depois; duas vírgulas seguidas. Nesses casos há mais de um reparo possível, e escolher um ao acaso seria entregar dados inventados que parecem reais. A página para, informa a linha e a coluna e mostra o ponto com uma seta. E ela não joga dados fora em silêncio: o que remove antes e depois do JSON é só a frase do chat.
Ela não confere se os dados estão certos. JSON reparado é JSON que pode ser lido, não JSON que diz a verdade: se o chat errou um preço, o preço continua errado. E ela não conhece o esquema que o seu programa espera.
Ela não faz os outros trabalhos. Para indentar, compactar ou ordenar as chaves de um JSON que já é válido, existe o Formatador e validador de JSON. Para transformá-lo em uma tabela e abrir no Excel, existe o JSON para CSV. Se o arquivo é YAML, o formato com indentação e sem colchetes, existe o YAML para JSON. E se da mesma resposta do chat você também precisa dos outros blocos de código, existe o Extrair código de IA.