Quelles exceptions Newtonsoft.Json.DeserializeObject lance-t-il?

Réponses:

124

JSON.NET définit les exceptions suivantes:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Les erreurs de sérialisation ou de désérialisation entraîneront généralement un fichier JsonSerializationException.

Thomas Levesque
la source
9
Merci, mais "typiquement"? Comment puis-je connaître les exceptions générées par DeseriazeObject?
cja
9
@cja, je pense que ça le sera toujours JsonSerializationException, mais pour être sûr qu'il faudrait demander à l'auteur ou regarder dans le code source ... Quoi qu'il en soit, vous pouvez juste attraper JsonExceptionsi vous voulez être sûr de ne rien manquer, puisque tout JSON Les exceptions .NET en héritent.
Thomas Levesque
167
Je pense que les exceptions doivent être correctement documentées.
KFL
J'obtiens le même détail d'exception, même avec la classe Exception dans le bloc catch, pouvez-vous s'il vous plaît m'aider à comprendre comment ils fonctionnent! Dans mon cas, j'obtiens actuellement une exception avec JSON qui a unicode, un outil en ligne capable de l'analyser correctement mais échouant avec JSONConvert
Naga
@KFL thats a nice think u got there bro
Mark S
60

Notez que la documentation de gestion des erreurs de Json.NET montre une stratégie pour l'utilisateur de l'API pour traiter les erreurs en gérant les événements d'erreur plutôt qu'en interceptant directement les exceptions. Cela a du sens si vous considérez que la désérialisation d'un seul élément d'un tableau peut échouer et que vous souhaiterez peut-être gérer cela de manière plus granulaire qu'une exception monolithique pour l'ensemble complet.

Cette réponse répond à la partie «veulent les gérer» de votre question sans arriver à la partie «quelles exceptions». Comme le montre une autre réponse, toutes les exceptions Json.NET héritent de la classe JsonException , donc attraper cela serait une bonne sécurité. Cependant, il semble que si vous voulez vraiment comprendre ce qui a provoqué la levée d'une exception, vous devez lire sa Messagepropriété, et non la poignée en fonction du Exceptiontype, car les différents types semblent être plus orientés sur l'action que vous effectuez que la catégorie d'erreur. Dans l'exemple de code suivant, le args.ErrorContext.Errorest une instance de Exception.

Exemple de code de la documentation:

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
la source