Ripara un JSON rotto
Incolla il JSON che non si apre: la risposta di una chat con il blocco di codice intorno, un file di configurazione con i commenti, un print di Python con True e None, un log con un oggetto per riga. Esce JSON valido, con l'elenco di ogni correzione e del punto in cui è stata fatta. Se il testo era tagliato, la pagina lo chiude e te lo dice chiaro. Non esce niente dal tuo browser.
Da dove arriva un JSON rotto
Quasi mai da un programma: i programmi scrivono JSON giusto. Arriva da una risposta di una chat, che lo mette dentro un blocco di codice con una frase prima e una dopo, e ogni tanto aggiunge un commento per spiegarti un campo. Arriva da un file di configurazione scritto a mano, dove la virgola dopo l'ultimo elemento e i commenti sono normali perché l'editor li accetta. Arriva da un print di Python, che scrive gli apici singoli e True, False e None. E arriva da un log, dove ogni riga è un oggetto a sé, spesso con l'ora o il nome del servizio davanti, e il file intero non è un JSON solo ma tanti di fila.
In tutti questi casi il programma che deve leggerlo si ferma al primo errore e dice qualcosa come «Unexpected token». Correggere a mano un errore si fa; quaranta sparsi in duemila righe, rilanciando ogni volta, no. Qui si incolla tutto, anche con la frase della chat intorno.
Ogni correzione è elencata, con la riga e la colonna
Un riparatore che restituisce un JSON valido senza dire che cosa ha toccato è una scatola nera: il file adesso si apre, ma non sai se dentro c'è ancora il dato che c'era prima. Qui ogni intervento ha una riga nell'elenco, con il punto esatto del testo che hai incollato: riga 14, colonna 3, virgola finale tolta.
Le correzioni non sono tutte uguali, e l'elenco lo dice. Togliere un commento, una virgola di troppo o il blocco del markdown non cambia nessun dato. Altre sono decisioni, e sono segnate come tali: NaN e Infinity diventano null perché JSON non ha un modo per scriverli, e fa così anche JSON.stringify; un numero scritto 007 diventa 7, e se era un CAP quegli zeri erano un dato; più oggetti di fila diventano una lista, perché un file JSON contiene un valore solo.
Il caso pericoloso: il JSON tagliato a metà
Succede di continuo con le chat: la risposta è lunga, il modello arriva al suo limite e si ferma nel mezzo di un elenco, spesso nel mezzo di una parola. Il testo che hai in mano non è sbagliato, è incompleto, e sono due problemi diversi. Rimetterci le chiusure che mancano lo rende valido, e qui si fa; ma un JSON chiuso così contiene meno dati dell'originale, e un programma che lo legge non ha nessun modo di accorgersene.
Per questo in quel caso la pagina non dice «valido» e basta. Dice che il testo è tagliato, a che riga e colonna finisce, dentro che cosa (un testo, un numero, una lista ancora aperta), quali chiusure ha aggiunto e quale pezzo ha tolto. E la regola è stretta: per chiudere si aggiungono solo virgolette e parentesi. Quello che è rimasto a metà e non si può chiudere senza inventare si toglie: il nome di una chiave spezzato, perché una chiave tagliata è un'altra chiave; un «tru» che poteva essere solo true; una virgola rimasta appesa.
Un esempio con i numeri: un elenco di 50 prodotti che si interrompe dentro il nome del trentottesimo esce come una lista di 38 elementi, l'ultimo con il nome troncato, e la pagina lo segnala come valore tagliato. Gli altri dodici non ci sono e nessuno li può ricostruire: bisogna chiedere alla chat di continuare, o di rispondere in più pezzi. Il file che scarichi in quel caso ha la parola incompleto nel nome, così non lo confondi con uno buono.
Le virgolette: dritte, curve e singole
Le virgolette curve arrivano quando il JSON passa da Word, da un'email o dalla tastiera di un telefono, che le «abbellisce» mentre scrivi. Dove fanno da delimitatore diventano dritte. Dentro un testo invece sono contenuto e restano come sono: una frase con le virgolette all'italiana non deve uscire diversa da come è entrata. Lo stesso vale per // e # dentro un indirizzo web, che non sono commenti, e per la parola True dentro una frase.
Gli apici singoli sono quelli di Python e di JavaScript. Qui si riconosce anche l'apostrofo dentro il testo, quello di l'amico: un apice chiude la stringa solo se dopo viene qualcosa che può seguire un valore, cioè una virgola, i due punti, una parentesi o la fine della riga. Le virgolette dritte dentro un testo senza la barra che le protegge, invece, non si indovinano: lì la pagina si ferma e dice dove.
Le barre rovesciate seguono la stessa idea. Se in un testo ce n'è anche una sola che JSON non conosce, come in C:\Users\anna\new, quel testo l'ha scritto una persona, e tutte le sue barre restano barre vere: anche quella davanti a new, che JSON leggerebbe come un a capo.
Quello che resta uguale, e come si controlla
Un JSON già valido esce con lo stesso valore, solo formattato. Sembra ovvio e non lo è: molti strumenti passano da JSON.parse, che porta un identificativo come 12345678901234567890 a 12345678901234567000, e un identificativo arrotondato è un altro identificativo. Qui i numeri restano il testo che erano, 1.50 compreso. Resta anche l'ordine delle chiavi, e le chiavi ripetute restano tutte e due, segnalate: quasi tutti i programmi tengono solo l'ultima, e scegliere quale buttare tocca a te.
La prova di questo strumento non è una manciata di esempi scelti a mano. Un programma genera centinaia di JSON validi, li rompe in modo noto annotando dove ha messo ogni guasto, e pretende che il valore riparato sia esattamente quello di partenza, riletto dalla libreria standard di Python, e che l'elenco dica proprio quei guasti, in quei punti. Sui testi tagliati pretende il pezzo più lungo che si possa tenere: niente di completo buttato via, e le chiusure che mancavano, non una di più.
Quello che non fa
Non indovina. Una parola senza virgolette dove ci vuole un valore, come stato: attivo; una data o una versione senza virgolette, come 2024-01-15 o 3.5.1, che non sono numeri; una parentesi chiusa con quella sbagliata, o una di troppo con altri dati dopo; due virgole di fila. In questi casi le riparazioni possibili sono più di una, e sceglierne una a caso vorrebbe dire consegnarti un dato inventato con l'aria di uno vero. La pagina si ferma, dice riga e colonna e ti mostra il punto con una freccia. E non butta via dati in silenzio: quello che toglie davanti e dopo il JSON è solo la frase della chat.
Non controlla che i dati siano giusti. Un JSON riparato è un JSON che si legge, non un JSON che dice il vero: se la chat ha sbagliato un prezzo, il prezzo resta sbagliato. E non conosce lo schema che si aspetta il tuo programma.
Non fa gli altri mestieri. Per indentare, compattare o ordinare le chiavi di un JSON che è già valido c'è Formatta e valida JSON. Per trasformarlo in una tabella da aprire in Excel c'è JSON in CSV. Se il file è YAML, il formato con i rientri e senza parentesi, c'è Da YAML a JSON. E se dalla stessa risposta della chat ti servono anche gli altri blocchi di codice, c'è Estrai il codice dall'AI.