Carattere imprevisto rilevato durante l'analisi del valore


113

Al momento ho dei problemi. Sto usando C # con Json.NET. Il problema è che ottengo sempre:

{"Carattere imprevisto rilevato durante l'analisi del valore: e. Path", riga 0, posizione 0. "}

Quindi il modo in cui utilizzo Json.NET è il seguente. Ho una classe che dovrebbe essere salvata. La classe ha questo aspetto:

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>();
    }
}

Un oggetto di questa classe verrà riempito e salvato con:

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

La parte di salvataggio funziona bene e il file esiste e viene riempito. Dopodiché il file verrà riletto nella classe con:

    try 
{ 

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

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

Ora sulla riga = corrente arriva l'eccezione:

{"Carattere imprevisto rilevato durante l'analisi del valore: e. Path", riga 0, posizione 0. "}

Non so perché questo avvenga. Il file json è il seguente -> Cliccami nel collegamento JSON

Qualcuno ha qualche idea?


2
Ho modificato il tuo titolo. Si prega di vedere "Le domande dovrebbero includere" tag "nei loro titoli? ", Dove il consenso è "no, non dovrebbero".
John Saunders

Affronti sempre questo problema, indipendentemente dai dati? Una volta, quando ho riscontrato un problema del genere, il motivo era che il servizio inviava caratteri UTF-8 non validi.
ankhuri

@ JohnSaunders mi dispiace per questo. lo terrò nel mio per ulteriori domande :).
zAfLu

1
@ankhuri si è appena dimenticato di leggere i file ... colpa mia
zAfLu

supponendo che non sia un problema, che altro? recv Eccezione-> {"topic": "robot1 / Log", "Msg": "Pilot Running"} Carattere imprevisto rilevato durante l'analisi del valore: o. Path '', linea 0, posizione 0.
Spiked3

Risposte:


149

Forse non stai passando JSON a DeserializeObject.

Sembra che da File.WriteAllText(tmpfile,...quel tipo di tmpfileè stringche contiene il percorso di un file. JsonConvert.DeserializeObjectaccetta il valore JSON, non il percorso del file, quindi non riesce a convertire qualcosa di simile @"c:\temp\fooo", che chiaramente non è JSON.


75

Ho risolto il problema con questi strumenti online:

  1. Per verificare se la struttura Json è OK: http://jsonlint.com/
  2. Per generare la mia classe Object dalla mia struttura Json: https://www.jsonutils.com/

Il codice semplice:

RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(pathFile));

2
Come check if the Json structure va bene in C #?
Kiquenet

1
Forse i aswers qui potrebbe aiutare: stackoverflow.com/questions/14977848/...
Edu Pelais

2
Grazie. json2csharp.com è stato un salvavita per me. Usandolo puoi eseguire il reverse-engineering su come dovrebbe apparire la classe corretta. Grazie ancora!
Aamir

1
Il collegamento json2csharp.com non funziona più. Consiglio invece di usare jsonutils.com .
Stijn

Ho cambiato l'URL rotto con uno nuovo come tuo suggerimento @Stijn.
Edu Pelais il

14

Ho riscontrato lo stesso errore nella mia soluzione Xamarin.Android.

Ho verificato che il mio JSON fosse corretto e ho notato che l'errore è apparso solo quando ho eseguito l'app come build di rilascio.

Si è scoperto che il Linker stava rimuovendo una libreria da Newtonsoft.JSON, causando un'analisi errata del JSON.

Ho corretto l'errore aggiungendo Newtonsoft.Json all'impostazione Ignora assembly nella configurazione build Android (schermata di seguito)

Codice di analisi 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);
    }
}

Screenshot per Mac di Visual Studio

inserisci qui la descrizione dell'immagine

Screenshot di Visual Studio

inserisci qui la descrizione dell'immagine


come posso farlo, su Visual Studio per l'app driod xamarin.forms?
Mike Darwish

1
@MikeDarwish Ho aggiunto uno screenshot che mostra come eseguire questa operazione in Visual Studio
Brandon Minnick,

9

Ho riscontrato questo errore anche per un'azione API Web (.Net Core 3.0) che era vincolante a a stringinvece a objecto aJObject . Il JSON era corretto, ma il binder ha tentato di ottenere una stringa dalla struttura JSON e non è riuscito.

Quindi, invece di:

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

Ho dovuto usare il più specifico:

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

Questo mi ha fatto il trucco su .Net Core 2.0, postando con Postman
Vitox il

È stato un grattacapo anche per me, ma ha senso perché ogni json è una coppia chiave-valore e dovresti fornire una classe con proprietà come chiavi per mappare correttamente json a un'istanza di quella classe
Eugene Zakharov

8

Nel mio caso, il file contenente la stringa JSON aveva BOM . Una volta rimosso BOM, il problema è stato risolto.

inserisci qui la descrizione dell'immagine


5

Questo problema è correlato al Byte Order Mark nel file JSON. Il file JSON non è codificato come dati di codifica UTF8 quando viene salvato. Utilizzando File.ReadAllText(pathFile)risolvi questo problema.

Quando operiamo su dati Byte e li convertiamo in stringa e quindi passiamo a JsonConvert.DeserializeObject, possiamo utilizzare la codifica UTF32 per ottenere la stringa.

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

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


3

Ho avuto lo stesso problema con webapi in ASP.NET core, nel mio caso era perché la mia applicazione ha bisogno di autenticazione, quindi assegna l'annotazione [AllowAnonymous]e ha funzionato.

[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
        
}

Sono in ritardo alla festa per questo, ma anche questo era il mio problema. Durante l'esame del "json" nel mio metodo Deserialize, ha mostrato che stava tentando di autenticarsi con l'API.
Ben

1

Supponiamo che questo sia il tuo json

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

se vuoi ancora deserializzare la sede, modifica json come di seguito

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

quindi provare a deserializzare nella rispettiva classe assumendo il valore di venue


1
Ciao, sto usando JsonConvert.SerializeObject, che produrrà il primo risultato da me, come ottengo il secondo?
user123456

Questo non risponde alla domanda che è stata posta.
Brian Rogers

1

Nel mio scenario avevo un messaggio leggermente diverso, in cui la linea e la posizione non erano zero.

E. Percorso "job [0] .name", riga 1, posizione 12.

Questa è stata la migliore risposta di Google per il messaggio che ho citato.

Ciò è avvenuto perché avevo chiamato un programma dalla riga di comando di Windows, passando JSON come parametro.

Quando ho rivisto gli argomenti nel mio programma, tutte le virgolette doppie sono state rimosse. Devi ricostituirli.

Ho pubblicato una soluzione qui . Anche se potrebbe probabilmente essere migliorato con un Regex.


1

Ho avuto un errore simile e ho pensato di rispondere nel caso qualcuno avesse qualcosa di simile. Stavo eseguendo il loop su una directory di file json e deserializzandoli, ma ricevevo lo stesso errore.

Il problema era che stava cercando di catturare anche file nascosti. Assicurati che il file che stai passando sia un file .json. Immagino che gestirà anche il testo. Spero che questo ti aiuti.


1

Nel mio caso, ho ricevuto un errore su JsonConvert.PopulateObject () . La mia richiesta stava restituendo JSON che era racchiuso in una coppia extra di parentesi "[]", rendendo il mio risultato un array di un oggetto piuttosto che solo un oggetto. Ecco cosa ho fatto per entrare in queste parentesi (solo per quel tipo di modello):

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

1

Se stai usando il download dei dati usando l'URL ... potrebbe essere necessario usare

var result = client.DownloadData(url);

0

Verifica che il modello che hai condiviso tra client e server sia lo stesso. a volte ricevi questo errore quando non hai aggiornato la versione Api e restituisce un modello aggiornato, ma ne hai ancora uno vecchio. A volte ottieni ciò che serializzi / deserializza non è un JSON valido.


-1

Ho riscontrato un messaggio di errore simile nei moduli Xamarin durante l'invio di una richiesta a webApi per ottenere un token,

  • Assicurati che tutte le chiavi ( key : value) (es. "Nome utente", "password", "grant_type") nel file Json siano esattamente ciò che il webApi si aspetta, altrimenti attiva questa eccezione.

Eccezione non gestita: Newtonsoft.Json.JsonReaderException: carattere imprevisto rilevato durante l'analisi del valore: <. Path '', riga 0, posizione 0


-3

Quando ho incontrato un problema simile, ho riparato sostituendo &mode=xmlper &mode=jsonla richiesta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.