Beim Analysieren des Werts ist ein unerwartetes Zeichen aufgetreten

113

Derzeit habe ich einige Probleme. Ich verwende C # mit Json.NET. Das Problem ist, dass ich immer bekomme:

{"Unerwartetes Zeichen beim Parsen des Werts: e. Pfad '', Zeile 0, Position 0."}

Ich verwende Json.NET also folgendermaßen. Ich habe eine Klasse, die gerettet werden soll. Die Klasse sieht so aus:

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

Ein Objekt dieser Klasse wird gefüllt und gespeichert mit:

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

Der Speicherteil funktioniert einwandfrei und die Datei existiert und ist gefüllt. Danach wird die Datei in die Klasse zurückgelesen mit:

    try 
{ 

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

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

Jetzt kommt in der Zeile current = die Ausnahme:

{"Unerwartetes Zeichen beim Parsen des Werts: e. Pfad '', Zeile 0, Position 0."}

Ich weiß nicht warum das kommt. Die JSON- Datei lautet wie folgt:> Klicken Sie auf mich im JSON-Link

Hat jemand irgendwelche Ideen?

zAfLu
quelle
2
Ich habe Ihren Titel bearbeitet. Weitere Informationen finden Sie unter " Sollten Fragen" Tags "in ihren Titeln enthalten? ", Wo der Konsens "Nein, sollten sie nicht" lautet.
John Saunders
Stehen Sie immer vor diesem Problem, unabhängig von den Daten? Als ich einmal auf ein solches Problem stieß, war der Grund, dass der Dienst ungültige UTF-8-Zeichen sendete.
Ankhuri
@ JohnSaunders Entschuldigung dafür. werde es für weitere Fragen in meinem behalten :).
zAfLu
1
@ankhuri habe nur vergessen, die Dateien einzulesen ... meine Schuld
zAfLu
Angenommen, das ist kein Problem, was noch? recv Ausnahme-> {"topic": "robot1 / Log", "Msg": "Pilot Running"} Unerwartetes Zeichen beim Parsen des Werts: o. Pfad '', Zeile 0, Position 0.
Spiked3

Antworten:

149

Möglicherweise geben Sie JSON nicht an weiter DeserializeObject .

Es sieht aus wie aus File.WriteAllText(tmpfile,...dieser Art von tmpfileheißt string, den Pfad zu einer Datei enthalten. JsonConvert.DeserializeObjectNimmt den JSON-Wert und nicht den Dateipfad - es wird also nicht versucht, so etwas zu konvertieren @"c:\temp\fooo"- was eindeutig nicht JSON ist.

Alexei Levenkov
quelle
75

Ich habe das Problem mit diesen Online-Tools gelöst:

  1. So überprüfen Sie, ob die Json-Struktur OKAY ist: http://jsonlint.com/
  2. So generieren Sie meine Objektklasse aus meiner Json-Struktur: https://www.jsonutils.com/

Der einfache Code:

RootObject rootObj= JsonConvert.DeserializeObject<RootObject>(File.ReadAllText(pathFile));
Edu Pelais
quelle
2
Wie check if the Json structure ist OKAY in C #?
Kiquenet
1
Vielleicht könnten Ihnen die Antworten hier helfen: stackoverflow.com/questions/14977848/…
Edu Pelais
2
Danke dir. json2csharp.com war ein Lebensretter für mich. Mit dieser Funktion können Sie zurückentwickeln, wie die richtige Klasse aussehen soll. Danke noch einmal!
Aamir
1
Der Link json2csharp.com funktioniert nicht mehr. Ich empfehle stattdessen jsonutils.com zu verwenden.
Stijn
Ich habe die kaputte URL als Vorschlag @Stijn in eine neue geändert.
Edu Pelais
14

Ich habe den gleichen Fehler in meiner Xamarin.Android-Lösung festgestellt.

Ich habe überprüft, ob mein JSON korrekt ist, und festgestellt, dass der Fehler nur aufgetreten ist, als ich die App als Release-Build ausgeführt habe.

Es stellte sich heraus, dass der Linker eine Bibliothek aus Newtonsoft.JSON entfernte, was dazu führte, dass der JSON falsch analysiert wurde.

Ich habe den Fehler behoben, indem ich Newtonsoft.Json zur Einstellung "Assemblys ignorieren" in der Android Build-Konfiguration hinzugefügt habe (Abbildung unten).

JSON-Parsing-Code

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

Visual Studio Mac Screenshot

Geben Sie hier die Bildbeschreibung ein

Visual Studio Screenshot

Geben Sie hier die Bildbeschreibung ein

Brandon Minnick
quelle
Wie kann ich das in Visual Studio für xamarin.forms Driod App machen?
Mike Darwish
1
@ MikeDarwish Ich habe einen Screenshot hinzugefügt, der zeigt, wie dies in Visual Studio erreicht wird
Brandon Minnick
9

Ich habe diesen Fehler auch bei einer Web-API-Aktion (.Net Core 3.0) festgestellt, die an a stringstatt an a objectoder a gebunden warJObject . Der JSON war korrekt, aber der Ordner hat versucht, eine Zeichenfolge aus der JSON-Struktur abzurufen, und ist fehlgeschlagen.

Also statt:

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

Ich musste das spezifischere verwenden:

[HttpPost("[action]")]
public object Search([FromBody] JObject data)
Alexei
quelle
Dies hat mir auf .Net Core 2.0
geholfen und
Es war auch für mich ein Kopfschmerz, aber es macht Sinn, weil jeder JSON ein Schlüssel-Wert-Paar ist und Sie eine Klasse mit Eigenschaften als Schlüssel bereitstellen sollten, um JSON einer Instanz dieser Klasse korrekt zuzuordnen
Eugene Zakharov
8

In meinem Fall hatte die Datei mit der JSON-Zeichenfolge eine Stückliste . Nachdem ich die Stückliste entfernt hatte, war das Problem behoben.

Geben Sie hier die Bildbeschreibung ein

Aleksei Mialkin
quelle
5

Dieses Problem hängt mit der Byte Order Mark in der JSON-Datei zusammen. JSON-Datei wird beim Speichern nicht als UTF8-Codierungsdaten codiert. Verwenden Sie File.ReadAllText(pathFile)dieses Problem.

Wenn wir Byte-Daten bearbeiten und diese in eine Zeichenfolge konvertieren und dann an JsonConvert.DeserializeObject übergeben, können wir die UTF32-Codierung verwenden, um die Zeichenfolge abzurufen.

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

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

Praveen
quelle
3

Ich hatte das gleiche Problem mit Webapi im ASP.NET-Kern. In meinem Fall musste meine Anwendung authentifiziert werden, dann wurde die Anmerkung zugewiesen [AllowAnonymous]und es funktionierte.

[AllowAnonymous]
public async Task <IList <IServic >> GetServices () {
        
}
Celso Xavier Luz
quelle
Ich bin zu spät zur Party, aber das war auch mein Problem. Bei der Untersuchung des "json" in meiner Deserialize-Methode wurde festgestellt, dass versucht wurde, sich bei der API zu authentifizieren.
Ben
1

Angenommen, dies ist dein json

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

Wenn Sie den Veranstaltungsort erneut deserialisieren möchten, ändern Sie json wie folgt

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

Versuchen Sie dann, die jeweilige Klasse zu deserialisieren, indem Sie den Wert des Veranstaltungsortes berücksichtigen

Hrishikesh TT
quelle
1
Hallo, ich verwende JsonConvert.SerializeObject, das das erste Ergebnis von mir erzeugt. Wie erhalte ich das zweite?
user123456
Dies beantwortet nicht die gestellte Frage.
Brian Rogers
1

In meinem Szenario hatte ich eine etwas andere Nachricht, bei der Linie und Position nicht Null waren.

E. Pfad 'job [0] .name', Zeile 1, Position 12.

Dies war die beste Antwort von Google auf die von mir zitierte Nachricht.

Dies geschah, weil ich ein Programm über die Windows-Befehlszeile aufgerufen hatte und JSON als Parameter übergeben hatte.

Als ich die Argumente in meinem Programm überprüfte, wurden alle doppelten Anführungszeichen entfernt. Sie müssen sie wiederherstellen.

Ich habe hier eine Lösung gepostet . Obwohl es wahrscheinlich mit einem Regex verbessert werden könnte.

JGFMK
quelle
1

Ich hatte einen ähnlichen Fehler und dachte, ich würde antworten, falls jemand etwas Ähnliches hat. Ich habe ein Verzeichnis von JSON-Dateien durchlaufen und sie deserialisiert, aber es wurde der gleiche Fehler angezeigt.

Das Problem war, dass versucht wurde, auch versteckte Dateien abzurufen. Stellen Sie sicher, dass es sich bei der übergebenen Datei um eine JSON-Datei handelt. Ich vermute, es wird auch Text verarbeiten. Hoffe das hilft.

Ibaeni
quelle
1

In meinem Fall wurde bei JsonConvert.PopulateObject () ein Fehler angezeigt . Meine Anfrage war die Rückgabe von JSON, das in ein zusätzliches Paar '[]' Klammern eingeschlossen war, wodurch mein Ergebnis ein Array aus einem Objekt und nicht nur aus einem Objekt wurde. Folgendes habe ich getan, um in diese Klammern zu gelangen (nur für diesen Modelltyp):

           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
quelle
1

Wenn Sie das Herunterladen von Daten über die URL verwenden, müssen Sie diese möglicherweise verwenden

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

Bitte überprüfen Sie, ob das Modell, das Sie zwischen Client und Server geteilt haben, identisch ist. Manchmal wird dieser Fehler angezeigt, wenn Sie die API-Version nicht aktualisiert haben und ein aktualisiertes Modell zurückgibt, Sie aber immer noch ein altes haben. Manchmal erhalten Sie, was Sie serialisieren / deserialisieren, ist kein gültiger JSON.

Nalan Madheswaran
quelle
-1

Ich habe eine ähnliche Fehlermeldung in Xamarin-Formularen erhalten, als ich eine Anfrage an webApi gesendet habe, um ein Token zu erhalten.

  • Stellen Sie sicher, dass alle Schlüssel ( Schlüssel : Wert) (z. B. "Benutzername", "Kennwort", "Grant_Type") in der Json-Datei genau den Erwartungen des webApi entsprechen. Andernfalls wird diese Ausnahme ausgelöst.

Nicht behandelte Ausnahme: Newtonsoft.Json.JsonReaderException: Unerwartetes Zeichen beim Parsen des Werts: <. Pfad '', Zeile 0, Position 0

A. Almazidi
quelle
-3

Wenn ich ein ähnliches Problem aufgetreten, fest ich es durch Substitution &mode=xmlfür &mode=jsondie Anfrage.

AlfredBauer
quelle