Riparare JSON
Sistema virgole finali, apici singoli, commenti e literal Python, con l’elenco di ogni modifica.
Nulla di ciò che incolli lascia il tuo browser. L’allowlist connect-src ne fa una garanzia del browser anziché una promessa. Verificalo tu stesso
La riparazione prende qualcosa che è quasi JSON e lo rende valido. Virgole finali, apici singoli, chiavi senza virgolette, commenti, literal Python, virgolette tipografiche, parentesi non chiuse, spazi invisibili.
La parte interessante non è l’output, è il registro delle modifiche. Uno strumento di riparazione che riscrive il tuo payload in silenzio è peggio di nessuno strumento, perché non puoi sapere che cosa ha deciso al posto tuo. Ogni modifica è elencata con riga e colonna, e quelle che hanno richiesto una scelta discrezionale sono elencate a parte.
Che cosa sistema senza dover indovinare
Questi casi hanno una sola interpretazione sensata, quindi vengono applicati senza altro commento oltre alla voce nel registro.
- Virgole finali e doppie
- Rimosse. Legali in JavaScript e JSON5, mai in JSON.
- Stringhe tra apici singoli
- Convertite in virgolette doppie, con il contenuto ri-escapato perché un apostrofo interno non rovini il risultato.
- Chiavi senza virgolette
- Vengono virgolettate. JavaScript accetta identificatori nudi come chiavi, JSON no.
- Commenti
- Rimossi, sia nella forma // sia nella forma /* */.
- Literal Python
- True, False e None diventano true, false e null.
- Virgolette tipografiche
- Le virgolette curve prodotte dal correttore automatico diventano virgolette ASCII dritte.
- Spazi bianchi non validi
- Gli spazi unificatori e i loro parenti diventano spazi normali; i caratteri a larghezza zero vengono rimossi.
- Byte order mark
- Rimosso dall’inizio del documento.
- Virgole e due punti mancanti
- Inseriti dove la grammatica rende l’intenzione priva di ambiguità.
- Caratteri di controllo grezzi nelle stringhe
- Vengono escapati, così un a capo letterale diventa \n.
Che cosa segnala come scelta discrezionale
Queste cambiano il significato, e nessun valore predefinito va bene per tutti. Vengono applicate, elencate a parte, e sono configurabili.
- Zeri iniziali
- L’impostazione predefinita mette il valore tra virgolette: 02134 diventa la stringa "02134". Nei dati reali gli zeri iniziali sono quasi sempre un CAP, un numero di conto o un codice prodotto, e toglierli distrugge il valore in silenzio. Se è davvero un numero, cambia la regola in «converti in numero» e diventa 2134.
- NaN, Infinity e undefined
- Convertiti in null, che è ciò che sostituiscono quasi tutti gli encoder. Python emette NaN e Infinity da json.dumps per impostazione predefinita; passa allow_nan=False per intercettarlo alla fonte.
- Parole nude usate come valori
- Vengono virgolettate come stringhe. {"status": pending} diventa {"status": "pending"}, cosa quasi sempre giusta e ogni tanto no.
- Parentesi non chiuse
- Vengono chiuse alla fine del documento. Se il file era troncato anziché scritto male, si ottiene un JSON valido a cui mancano dei dati: per questo la modifica viene sempre elencata.
- NDJSON
- Più valori completi, uno per riga, vengono racchiusi in un array per impostazione predefinita. Puoi anche tenere solo il primo record, o lasciare l’input com’è.
Che cosa non farà
Non inventerà struttura. Se l’input non è abbastanza vicino al JSON, la riparazione fallisce e indica quali errori non è riuscita a risolvere, invece di produrre qualcosa che si analizza ma non significa nulla.
Esegue anche un numero limitato di passate. Ogni passata può far emergere un problema che la precedente nascondeva, ma il processo converge invece di entrare in ciclo.
How to do this in code
Come farlo nel codice, con l’avvertenza onesta che analizzare in modo permissivo lato consumatore di solito significa che qualcosa a monte sta producendo JSON sbagliato e continuerà a farlo.
py Python, repr di dict
ast.literal_eval valuta solo strutture literal, quindi a differenza di eval non può eseguire codice arbitrario.
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 è un soprainsieme con una specifica vera, il che lo rende un obiettivo migliore di un parser permissivo improvvisato.
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 Domande frequenti
- La riparazione modificherà mai i miei dati?
- Solo nei modi elencati tra le scelte discrezionali, e ognuno compare nel registro con riga e colonna. Le riparazioni sicure toccano solo la sintassi. Se una scelta non ti convince, cambia l’impostazione e rilancia.
- Perché 02134 diventa una stringa e non il numero 2134?
- Perché virgolettare non perde nulla e tagliare sì. Nei dati reali gli zeri iniziali sono quasi sempre significativi, e un convertitore che trasformasse in silenzio un CAP in un numero più piccolo farebbe esattamente il tipo di danno silenzioso che questo sito esiste per evitare. L’opzione per tagliarli è a un clic.
- Dice che non è riuscito a riparare il documento. E adesso?
- Passalo al validatore. La riparazione gestisce solo problemi con una correzione priva di ambiguità; un documento con una struttura davvero irrecuperabile ha bisogno di una persona che decida che cosa si intendeva scrivere.