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
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.
-
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); -
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); -
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