Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
A JsonConvert.DeserializeObject è stato passato qualcosa che non comincia con un valore JSON. Riga 0 posizione 0 significa che ha fallito sul primissimo carattere. Il carattere nominato nel messaggio ti dice che cosa hai davvero.
Incolla il tuo JSON e vedi esattamente dove si rompe
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
Che cosa lo provoca davvero
In ordine di quanto spesso ciascuno si rivela essere la risposta.
-
01 Hai passato un percorso di file anziché il contenuto del file
DeserializeObject vuole una stringa JSON, non un nome di file. Passare un percorso fa sì che il parser legga C:\... come documento e fallisca sulla lettera C o su una barra. È un errore molto comune e il messaggio non lo lascia minimamente intuire.
Si rompe
var data = JsonConvert.DeserializeObject<Model>(@"C:\data\input.json");Funziona
var json = File.ReadAllText(@"C:\data\input.json"); var data = JsonConvert.DeserializeObject<Model>(json); -
02 La risposta è HTML
Una pagina di errore, un redirect al login o un errore IIS. Il carattere nel messaggio sarà <. Leggi il corpo come stringa ed esaminalo prima di deserializzare.
Si rompe
var data = JsonConvert.DeserializeObject<Model>(await res.Content.ReadAsStringAsync());Funziona
var body = await res.Content.ReadAsStringAsync(); if (!res.IsSuccessStatusCode || !body.TrimStart().StartsWith("{")) throw new InvalidOperationException($"{(int)res.StatusCode}: {body[..Math.Min(300, body.Length)]}"); var data = JsonConvert.DeserializeObject<Model>(body); -
03 Un byte order mark all’inizio della stringa
Leggere un file senza lasciare che il rilevatore di codifica tolga il BOM lascia un U+FEFF davanti al JSON.
Lo stesso errore in altri runtime
Il problema di fondo è identico; cambia solo la formulazione. Se un collega segnala uno di questi messaggi, sta guardando esattamente la stessa cosa che vedi tu.
| C# (System.Text.Json) | '<' is an invalid start of a value. Path: $ | LineNumber: 0 | BytePositionInLine: 0. |
|---|---|
| JavaScript (V8) | Unexpected token '<', "<!DOCTYPE "... is not valid JSON |
Domande frequenti
- Conviene migrare a System.Text.Json?
- È l’opzione integrata da .NET Core 3.0 in poi ed è più veloce, ma è anche più severa: niente stringhe tra apici singoli, niente virgole finali, niente commenti a meno che tu non li abiliti esplicitamente. Il codice che contava sulla tolleranza di Newtonsoft richiederà di sistemare chi produce il JSON.
Risolvilo adesso
Incolla il payload nello strumento qui sopra, oppure vai direttamente a quello creato per questo compito.
Controlla il payload