Newtonsoft.Json.DeserializeObject hangi istisnaları atar?


Yanıtlar:


124

JSON.NET aşağıdaki istisnaları tanımlar:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

Serileştirme veya seriyi kaldırma hataları genellikle bir JsonSerializationException.


9
Teşekkürler ama "tipik" mi? DeseriazeObject'in hangi istisnaları attığını kesin olarak nasıl öğrenebilirim?
cja

9
@cja, bence her zaman olacak JsonSerializationException, ama emin olmak için yazara sormanız veya kaynak koduna bakmanız gerekecek ... Her neyse, JsonExceptionhiçbir şeyi kaçırmadığınızdan emin olmak istiyorsanız yakalayabilirsiniz , çünkü tüm JSON .NET istisnaları ondan devralır.
Thomas Levesque

167
İstisnaların düzgün bir şekilde belgelenmesi gerektiğini düşünüyorum.
KFL

Aynı istisna detayını catch bloğundaki Exception sınıfıyla bile alıyorum, lütfen nasıl çalıştıklarını anlamama yardım eder misiniz? Benim durumumda şu anda unicode içeren JSON ile istisna alıyorum, çevrimiçi araç doğru şekilde ayrıştırabiliyor ancak JSONConvert ile başarısız oluyor
Naga

@KFL thats a nice think u got there bro
Mark S

60

Not o Json.NET en hata işleme belgeleri , API kullanıcısının istisnaları doğrudan yakalamak yerine hata olaylarını için bir strateji gösterdiğini . Bu, bir dizideki belki yalnızca bir öğenin seriyi kaldırmada başarısız olabileceğini düşündüğünüzde mantıklıdır ve bunu tüm küme için tek bir monolitik istisnadan daha ayrıntılı bir şekilde ele almak isteyebilirsiniz.

Bu cevap, "hangi istisnalar" kısmına girmeden sorunuzun "onları ele almak istiyorum" kısmına hitap eder. Başka bir yanıtın gösterdiği gibi, tüm Json.NET istisnaları JsonException Class'tan , bu yüzden bunu yakalamak güzel bir hata koruması olacaktır. Bununla birlikte, bir istisnanın atılmasına neyin sebep olduğunu gerçekten anlamak istiyorsanız , farklı türler gerçekleştirdiğiniz eyleme göre daha fazla odaklanmış göründüğünden Message, Exceptiontürüne göre işlem yapmadan onun özelliğini okumanız gerekecek gibi görünüyor. hata kategorisi. Aşağıdaki örnek, kodda, args.ErrorContext.Errorbir örneğidir Exception.

Belgelerden örnek kod:

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.