Unexpected character encountered while parsing value: <. Path '', line 0, position 0.
JsonConvert.DeserializeObject bekam etwas übergeben, das nicht mit einem JSON-Wert beginnt. Zeile 0 Position 0 heißt, dass es am allerersten Zeichen scheiterte. Das in der Meldung genannte Zeichen sagt Ihnen, was Sie tatsächlich haben.
Fügen Sie Ihr JSON ein und sehen Sie genau, wo es bricht
Nichts, was Sie einfügen, verlässt Ihren Browser. Die connect-src Erlaubnisliste macht daraus eine Garantie des Browsers statt eines Versprechens. Selbst überprüfen
Was es tatsächlich auslöst
Sortiert danach, wie oft sich das jeweilige als die Antwort herausstellt.
-
01 Sie haben einen Dateipfad statt des Dateiinhalts übergeben
DeserializeObject erwartet eine JSON-Zeichenkette, keinen Dateinamen. Übergibt man einen Pfad, liest der Parser C:\... als Dokument und scheitert am Buchstaben C oder an einem Schrägstrich. Ein sehr häufiger Fehler, auf den die Meldung mit keinem Wort hinweist.
Geht kaputt
var data = JsonConvert.DeserializeObject<Model>(@"C:\data\input.json");Funktioniert
var json = File.ReadAllText(@"C:\data\input.json"); var data = JsonConvert.DeserializeObject<Model>(json); -
02 Die Antwort ist HTML
Eine Fehlerseite, eine Weiterleitung zum Login oder ein IIS-Fehler. Das Zeichen in der Meldung wird < sein. Lesen Sie den Körper als Zeichenkette und sehen Sie ihn sich an, bevor Sie deserialisieren.
Geht kaputt
var data = JsonConvert.DeserializeObject<Model>(await res.Content.ReadAsStringAsync());Funktioniert
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 Ein Byte Order Mark am Anfang der Zeichenkette
Eine Datei zu lesen, ohne die Kodierungserkennung das BOM entfernen zu lassen, hinterlässt ein U+FEFF vor dem JSON.
Derselbe Fehler in anderen Laufzeitumgebungen
Das zugrunde liegende Problem ist identisch; nur der Wortlaut unterscheidet sich. Meldet eine Kollegin eine dieser Zeilen, sieht sie genau dasselbe wie Sie.
| 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 |
Häufige Fragen
- Soll ich auf System.Text.Json umsteigen?
- Es ist ab .NET Core 3.0 die eingebaute Option und schneller, aber auch strenger: keine Zeichenketten in einfachen Anführungszeichen, keine Kommas am Ende, keine Kommentare, sofern Sie sie nicht ausdrücklich aktivieren. Code, der sich auf Newtonsofts Nachsicht verließ, verlangt, dass der Erzeuger repariert wird.
Jetzt beheben
Fügen Sie das Payload in das Werkzeug oben ein, oder gehen Sie direkt zu dem, das für diesen Zweck gebaut wurde.
Das Payload prüfen