Ir para o conteúdo
jsonbeautifiers
Português
C# Texto da mensagem transcrito de ocorrências relatadas; não executado aqui.

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

Passaram para o JsonConvert.DeserializeObject algo que não começa com um valor JSON. Linha 0 posição 0 significa que ele falhou no primeiríssimo caractere. O caractere citado na mensagem te diz o que você tem de fato.

Cole o seu JSON e veja exatamente onde ele quebra

Entrada

Nada do que você cola sai do seu navegador. A lista de permissões connect-src transforma isso em uma garantia do navegador, e não em uma promessa. Confira você mesmo

O que realmente causa isso

Ordenados por quantas vezes cada um acaba sendo a resposta.

  1. 01 Você passou um caminho de arquivo em vez do conteúdo do arquivo

    O DeserializeObject espera uma string JSON, não um nome de arquivo. Passar um caminho faz o parser ler C:\... como o documento e falhar na letra C ou em uma barra. É um erro muito comum e a mensagem não dá pista nenhuma disso.

    Quebra

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

    Funciona

    var json = File.ReadAllText(@"C:\data\input.json");
    var data = JsonConvert.DeserializeObject<Model>(json);
  2. 02 A resposta é HTML

    Uma página de erro, um redirecionamento de login ou um erro do IIS. O caractere na mensagem será <. Leia o corpo como string e inspecione antes de desserializar.

    Quebra

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

    Funciona

    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 Uma marca de ordem de bytes no começo da string

    Ler um arquivo sem deixar o detector de codificação remover o BOM deixa um U+FEFF na frente do JSON.

O mesmo erro em outros runtimes

O problema de fundo é idêntico; só muda a redação. Se um colega reportar uma dessas mensagens, ele está olhando exatamente para a mesma coisa que você.

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

Perguntas frequentes

Devo migrar para System.Text.Json?
É a opção embutida do .NET Core 3.0 em diante e é mais rápida, mas também mais rígida: nada de strings com aspas simples, nem vírgulas sobrando, nem comentários a menos que você habilite explicitamente. Código que contava com a tolerância do Newtonsoft vai exigir consertar quem produz.

Conserte agora

Cole o payload na ferramenta acima, ou vá direto para a que foi feita para este trabalho.

Conferir o payload