Vraag Welke uitzonderingen genereert Newtonsoft.Json.Object throw?


Welke uitzonderingen genereert Newtonsoft.Json.Object throw? Ik wil met ze omgaan.

http://james.newtonking.com/json/help/?topic=html/M_Newtonsoft_Json_JsonConvert_DeserializeObject.htm#seeAlsoToggle


62
2017-10-08 19:06


oorsprong


antwoorden:


JSON.NET definieert de volgende uitzonderingen:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Serialisatie- of deserialisatiefouten resulteren meestal in een JsonSerializationException.


68
2017-10-08 19:28



Let daar op Json.NET's documentatie voor foutafhandeling toont een strategie voor de API-gebruiker om met fouten om te gaan door foutgebeurtenissen af ​​te handelen in plaats van direct uitzonderingen op te vangen. Dit is logisch als u bedenkt dat misschien slechts één item in een array deserialiseert, en misschien wilt u dit op een meer gedetailleerde manier aanpakken dan één monolithische uitzondering voor de hele set.

Dit antwoord gaat in op het gedeelte 'wil ze afhandelen' van je vraag zonder in het gedeelte 'wat uitzonderingen' te komen. Zoals een ander antwoord laat zien, erven alle Json.NET-uitzonderingen van JsonException Class, dus dit zou een leuke fail-safe zijn. Het lijkt er echter op dat als je echt wilt begrijpen waardoor een uitzondering is veroorzaakt, je het moet lezen Message eigendom, niet omgaan op basis van de Exception type, omdat de verschillende typen meer georiënteerd lijken op de actie die u uitvoert dan de foutcategorie. In de voorbeeldcode, de args.ErrorContext.Error is een Exception type.

Voorbeeldcode uit de documentatie:

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.

35
2018-01-08 17:59