Caractere inesperado encontrado ao analisar o valor

113

Atualmente estou com alguns problemas. Estou usando C # com Json.NET. O problema é que sempre consigo:

{"Caractere inesperado encontrado durante a análise do valor: e. Caminho '', linha 0, posição 0."}

Portanto, estou usando o Json.NET da seguinte maneira. Eu tenho uma aula que deve ser salva. A classe se parece com isto:

public class stats
{
    public string time { get; set; }
    public string value { get; set; }
}

public class ViewerStatsFormat
{
    public List<stats> viewerstats { get; set; }
    public String version { get; set; }

    public ViewerStatsFormat(bool chk)
    {
        this.viewerstats = new List<stats>();
    }
}

Um objeto desta classe será preenchido e salvo com:

 File.WriteAllText(tmpfile, JsonConvert.SerializeObject(current), Encoding.UTF8);

A parte de salvamento funciona bem e o arquivo existe e é preenchido. Depois disso, o arquivo será lido de volta na classe com:

    try 
{ 

    ViewerStatsFormat current = JsonConvert.DeserializeObject<ViewerStatsFormat>(tmpfile);
    //otherstuff        

}
catch(Exception ex)
{
    //error loging stuff
}

Agora, na linha current = vem a exceção:

{"Caractere inesperado encontrado durante a análise do valor: e. Caminho '', linha 0, posição 0."}

Eu não sei por que isso vem. O arquivo json é o seguinte -> Clique aqui no link JSON

Alguém tem alguma idéia?

zAfLu
fonte
2
Eu editei seu título. Consulte " As perguntas devem incluir“ tags ”em seus títulos? ", Onde o consenso é "não, não deveriam".
John Saunders
Você sempre enfrenta esse problema, não importa quais sejam os dados? Uma vez, quando enfrentei esse problema, o motivo era que o serviço estava enviando caracteres UTF-8 inválidos.
ankhuri
@JohnSaunders, desculpe por isso. vou mantê-lo no meu para mais perguntas :).
zAfLu
1
@ankhuri apenas esqueci de ler os arquivos ... minha culpa
zAfLu
presumindo que isso não seja um problema, o que mais? recv Exception-> {"topic": "robot1 / Log", "Msg": "Pilot Running"} Caractere inesperado encontrado durante a análise do valor: o. Caminho '', linha 0, posição 0.
Ocorreu um pico em 3 de

Respostas:

149

Possivelmente você não está passando JSON para DeserializeObject.

Parece que a partir File.WriteAllText(tmpfile,...desse tipo de tmpfileé stringque contêm caminho para um arquivo. JsonConvert.DeserializeObjectleva o valor JSON, não o caminho do arquivo - portanto, falha ao tentar converter algo como @"c:\temp\fooo"- que claramente não é JSON.

Alexei Levenkov
fonte
75

Resolvi o problema com estas ferramentas online:

  1. Para verificar se a estrutura Json está OK: http://jsonlint.com/
  2. Para gerar minha classe Object a partir de minha estrutura Json: https://www.jsonutils.com/

O código simples:

RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(pathFile));
Edu Pelais
fonte
2
Como fazer check if the Json structure está OK em C #?
Kiquenet
1
Talvez as respostas aqui possam ajudá-lo: stackoverflow.com/questions/14977848/…
Edu Pelais
2
Obrigado. json2csharp.com foi um salva-vidas para mim. Usando-o, você pode fazer a engenharia reversa de volta para a aparência da classe correta. Obrigado novamente!
Aamir
1
O link json2csharp.com não funciona mais. Eu recomendo usar jsonutils.com em vez disso.
Stijn
Mudei o url quebrado para um novo como sua sugestão @Stijn.
Edu Pelais
14

Eu experimentei o mesmo erro na minha solução Xamarin.Android.

Verifiquei se meu JSON estava correto e percebi que o erro só apareceu quando executei o aplicativo como uma versão Release.

Descobriu-se que o Linker estava removendo uma biblioteca do Newtonsoft.JSON, fazendo com que o JSON fosse analisado incorretamente.

Corrigi o erro adicionando Newtonsoft.Json à configuração Ignorar assemblies na configuração do Android Build (captura de tela abaixo)

Código de análise JSON

static readonly JsonSerializer _serializer = new JsonSerializer();
static readonly HttpClient _client = new HttpClient();

static async Task<T> GetDataObjectFromAPI<T>(string apiUrl)
{
    using (var stream = await _client.GetStreamAsync(apiUrl).ConfigureAwait(false))
    using (var reader = new StreamReader(stream))
    using (var json = new JsonTextReader(reader))
    {
        if (json == null)
            return default(T);

        return _serializer.Deserialize<T>(json);
    }
}

Captura de tela do Visual Studio Mac

insira a descrição da imagem aqui

Captura de tela do Visual Studio

insira a descrição da imagem aqui

Brandon Minnick
fonte
como posso fazer isso, no Visual studio for xamarin.forms driod app?
Mike Darwish
1
@MikeDarwish Eu adicionei uma captura de tela mostrando como fazer isso no Visual Studio
Brandon Minnick
9

Também encontrei este erro para uma ação da API da Web (.Net Core 3.0) que estava vinculando a um em stringvez de um objectou a JObject. O JSON estava correto, mas o fichário tentou obter uma string da estrutura JSON e falhou.

Então, em vez de:

[HttpPost("[action]")]
public object Search([FromBody] string data)

Tive que usar o mais específico:

[HttpPost("[action]")]
public object Search([FromBody] JObject data)
Alexei
fonte
Isso funcionou para mim no .Net Core 2.0, postando com Postman
Vitox
Foi uma dor de cabeça para mim também, mas faz sentido porque cada json é um par de valor-chave e você deve fornecer uma classe com propriedades como chaves para mapear corretamente json para uma instância dessa classe
Eugene Zakharov
8

No meu caso, o arquivo contendo string JSON tinha BOM . Depois de remover o BOM, o problema foi resolvido.

insira a descrição da imagem aqui

Aleksei Mialkin
fonte
5

Esse problema está relacionado à marca de ordem de bytes no arquivo JSON. O arquivo JSON não é codificado como dados de codificação UTF8 quando salvo. Usando File.ReadAllText(pathFile)corrigir este problema.

Quando estamos operando com dados Byte e convertendo-os em string e depois passando para JsonConvert.DeserializeObject, podemos usar a codificação UTF32 para obter a string.

byte[] docBytes = File.ReadAllBytes(filePath);

string jsonString = Encoding.UTF32.GetString(docBytes);

Praveen
fonte
3

Tive o mesmo problema com o webapi no ASP.NET Core, no meu caso foi porque meu aplicativo precisa de autenticação, então ele atribui a anotação [AllowAnonymous]e funcionou.

[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
        
}
Celso Xavier Luz
fonte
Estou atrasado para a festa nisso, mas esse era o meu problema também. Ao examinar o "json" entrando em meu método Deserialize, ele mostrou que estava tentando autenticar com a API.
Ben
1

Suponha que este seja o seu json

{
  "date":"11/05/2016",
  "venue": "{\"ID\":12,\"CITY\":Delhi}"
}

se você quiser desserializar o local novamente, modifique o json como abaixo

{
  "date":"11/05/2016",
  "venue": "{\"ID\":\"12\",\"CITY\":\"Delhi\"}"
}

em seguida, tente desserializar para a respectiva classe, tomando o valor do local

Hrishikesh TT
fonte
1
Olá, estou usando JsonConvert.SerializeObject, que produzirá o primeiro resultado de mim. Como faço para obter o segundo?
user123456
Isso não responde à pergunta que foi feita.
Brian Rogers
1

No meu cenário, recebi uma mensagem um pouco diferente, em que a linha e a posição não eram zero.

E. Caminho 'job [0] .name', linha 1, posição 12.

Esta foi a principal resposta do Google para a mensagem que citei.

Isso aconteceu porque eu tinha chamado um programa da linha de comando do Windows, passando JSON como parâmetro.

Quando revisei os argumentos em meu programa, todas as aspas duplas foram removidas. Você tem que reconstituí-los.

Postei uma solução aqui . Embora provavelmente pudesse ser aprimorado com um Regex.

JGFMK
fonte
1

Eu tive um erro semelhante e pensei em responder caso alguém estivesse tendo algo semelhante. Eu estava fazendo um loop em um diretório de arquivos json e desserializando-os, mas estava recebendo o mesmo erro.

O problema era que ele também estava tentando capturar arquivos ocultos. Certifique-se de que o arquivo que você está transmitindo seja um arquivo .json. Suponho que também lida com texto. Espero que isto ajude.

Ibaeni
fonte
1

No meu caso, estava recebendo um erro em JsonConvert.PopulateObject () . Minha solicitação estava retornando JSON que estava envolto em um par extra de colchetes '[]', tornando meu resultado uma matriz de um objeto em vez de apenas um objeto. Aqui está o que eu fiz para entrar nesses colchetes (apenas para esse tipo de modelo):

           T jsonResponse = new T();
                var settings = new JsonSerializerSettings
                {
                    DateParseHandling = DateParseHandling.DateTimeOffset,
                    NullValueHandling = NullValueHandling.Ignore,
                };
                var jRslt = response.Content.ReadAsStringAsync().Result;
                if (jsonResponse.GetType() == typeof(myProject.Models.myModel))
                {
                    var dobj = JsonConvert.DeserializeObject<myModel[]>(jRslt);
                    var y = dobj.First();
                    var szObj = JsonConvert.SerializeObject(y);
                    JsonConvert.PopulateObject(szObj, jsonResponse, settings);
                }
                else
                {
                    JsonConvert.PopulateObject(jRslt, jsonResponse);
                }
PKucas
fonte
1

Se você estiver usando o download de dados usando url ... pode ser necessário usar

var result = client.DownloadData(url);
Taran
fonte
0

Verifique se o modelo que você compartilhou entre o cliente e o servidor é o mesmo. às vezes você obtém este erro quando não atualiza a versão da Api e ela retorna um modelo atualizado, mas você ainda tem um antigo. Às vezes, você obtém o que serializa / desserializa não é um JSON válido.

Nalan Madheswaran
fonte
-1

Eu enfrentei uma mensagem de erro semelhante em formulários Xamarin ao enviar uma solicitação para webApi para obter um token,

  • Certifique-se de que todas as chaves ( chave : valor) (ex. 'Nome de usuário', 'senha', 'grant_type') no arquivo Json são exatamente o que o webApi espera, caso contrário, ele dispara essa exceção.

Exceção não tratada: Newtonsoft.Json.JsonReaderException: Caractere inesperado encontrado ao analisar o valor: <. Caminho '', linha 0, posição 0

A. Almazidi
fonte
-3

Quando encontrei um problema semelhante, corrigi-lo substituindo &mode=xmlpor &mode=jsonna solicitação.

AlfredBauer
fonte