Quelles exceptions Newtonsoft.Json.DeserializeObject lance-t-il? Je veux les gérer.
Quelles exceptions Newtonsoft.Json.DeserializeObject lance-t-il? Je veux les gérer.
Réponses:
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
.
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 JsonException
si vous voulez être sûr de ne rien manquer, puisque tout JSON Les exceptions .NET en héritent.
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 Message
propriété, et non la poignée en fonction du Exception
type, 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.Error
est 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.