Aller au contenu
jsonbeautifiers
Français
C# Texte du message transcrit à partir de cas signalés ; non exécuté ici.

Unexpected character encountered while parsing value: <. Path '', line 0, position 0.

On a passé à JsonConvert.DeserializeObject quelque chose qui ne commence pas par une valeur JSON. Ligne 0 position 0 signifie qu’il a échoué au tout premier caractère. Le caractère nommé dans le message vous dit ce que vous avez réellement.

Collez votre JSON et voyez exactement où il casse

Entrée

Rien de ce que vous collez ne quitte votre navigateur. La liste d’autorisation connect-src en fait une garantie du navigateur plutôt qu’une promesse. Vérifiez-le vous-même

Ce qui le provoque réellement

Classés selon la fréquence à laquelle chacun se révèle être la réponse.

  1. 01 Vous avez passé un chemin de fichier au lieu du contenu du fichier

    DeserializeObject attend une chaîne JSON, pas un nom de fichier. Passer un chemin fait lire C:\... comme document à l’analyseur, qui échoue sur la lettre C ou sur une barre oblique. C’est une erreur très courante et le message n’y fait pas la moindre allusion.

    Casse

    var data = JsonConvert.DeserializeObject<Model>(@"C:\data\input.json");

    Fonctionne

    var json = File.ReadAllText(@"C:\data\input.json");
    var data = JsonConvert.DeserializeObject<Model>(json);
  2. 02 La réponse est du HTML

    Une page d’erreur, une redirection vers la connexion ou une erreur IIS. Le caractère du message sera <. Lisez le corps comme une chaîne et inspectez-le avant de désérialiser.

    Casse

    var data = JsonConvert.DeserializeObject<Model>(await res.Content.ReadAsStringAsync());

    Fonctionne

    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 Une marque d’ordre des octets au début de la chaîne

    Lire un fichier sans laisser le détecteur d’encodage retirer le BOM laisse un U+FEFF devant le JSON.

La même erreur dans d’autres environnements

Le problème de fond est identique ; seule la formulation change. Si un collègue signale l’un de ces messages, il regarde exactement la même chose que vous.

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

Questions fréquentes

Dois-je migrer vers System.Text.Json ?
C’est l’option intégrée depuis .NET Core 3.0 et elle est plus rapide, mais elle est aussi plus stricte : pas de chaînes entre apostrophes, pas de virgules finales, pas de commentaires sauf activation explicite. Le code qui reposait sur la tolérance de Newtonsoft exigera de corriger le producteur.

Corrigez-le maintenant

Collez le payload dans l’outil ci-dessus, ou allez directement à celui conçu pour ce travail.

Vérifier le payload