Welche Ausnahmen wirft Newtonsoft.Json.DeserializeObject?

Antworten:

124

JSON.NET definiert die folgenden Ausnahmen:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Serialisierungs- oder Deserialisierungsfehler führen normalerweise zu a JsonSerializationException.

Thomas Levesque
quelle
9
Danke, aber "typisch"? Wie kann ich mit Sicherheit herausfinden, welche Ausnahmen DeseriazeObject auslöst?
Cja
9
@cja, ich denke es wird immer so sein JsonSerializationException, aber um sicher zu sein, müsstest du den Autor fragen oder in den Quellcode schauen ... Wie auch immer, du kannst einfach fangen, JsonExceptionwenn du sicher sein willst, nichts zu verpassen, da alle JSON .NET-Ausnahmen erben davon.
Thomas Levesque
167
Ich denke, Ausnahmen müssen ordnungsgemäß dokumentiert werden.
KFL
Ich erhalte das gleiche Ausnahmedetail, auch mit der Ausnahmeklasse im catch-Block. Können Sie mir bitte helfen, zu verstehen, wie sie funktionieren? In meinem Fall bekomme ich gerade eine Ausnahme mit JSON, das Unicode hat, ein Online-Tool, das es korrekt analysieren kann, aber mit JSONConvert
Naga
@KFL das ist ein schöner Gedanke, du bist dort angekommen, Bruder
Mark S
60

Beachten Sie, dass die Fehlerbehandlungsdokumentation von Json.NET eine Strategie für den API-Benutzer zeigt, mit Fehlern umzugehen, indem Fehlerereignisse behandelt werden, anstatt Ausnahmen direkt abzufangen. Dies ist sinnvoll, wenn Sie bedenken, dass möglicherweise nur ein Element in einem Array nicht deserialisiert werden kann, und Sie möchten dies möglicherweise detaillierter behandeln als eine monolithische Ausnahme für den gesamten Satz.

Diese Antwort befasst sich mit dem Teil "Ich möchte mit ihnen umgehen" Ihrer Frage, ohne zum Teil "Welche Ausnahmen" zu gelangen. Wie eine andere Antwort zeigt, erben alle Json.NET-Ausnahmen von der JsonException-Klasse. Daher wäre es eine gute Ausfallsicherheit , dies zu erfassen . Es scheint jedoch, dass Sie, wenn Sie wirklich verstehen möchten, was das Auslösen einer Ausnahme verursacht hat, deren MessageEigenschaft lesen müssen , nicht basierend auf dem ExceptionTyp, da die verschiedenen Typen mehr auf die von Ihnen ausgeführte Aktion ausgerichtet zu sein scheinen als die Fehlerkategorie. Im folgenden Beispielcode args.ErrorContext.Errorist das eine Instanz von Exception.

Beispielcode aus der Dokumentation:

List<string> errors = new List<string>();

List<DateTime> c = JsonConvert.DeserializeObject<List<DateTime>>(@"[
      '2009-09-09T00:00:00Z',
      'I am not a date and will error!',
      [
        1
      ],
      '1977-02-20T00:00:00Z',
      null,
      '2000-12-01T00:00:00Z'
    ]",
    new JsonSerializerSettings
    {
        Error = delegate(object sender, ErrorEventArgs args)
        {
            errors.Add(args.ErrorContext.Error.Message);
            args.ErrorContext.Handled = true;
        },
        Converters = { new IsoDateTimeConverter() }
    });

// 2009-09-09T00:00:00Z
// 1977-02-20T00:00:00Z
// 2000-12-01T00:00:00Z

// The string was not recognized as a valid DateTime. There is a unknown word starting at index 0.
// Unexpected token parsing date. Expected String, got StartArray.
// Cannot convert null value to System.DateTime.
Karl Wenzel
quelle