Vai al contenuto
jsonbeautifiers
Italiano
C# Testo del messaggio trascritto da casi segnalati; non eseguito qui.

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

Input

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.

  1. 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);
  2. 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);
  3. 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