Newtonsoft.Json.DeserializeObject throw มีข้อยกเว้นอะไรบ้าง


คำตอบ:


124

JSON.NET กำหนดข้อยกเว้นต่อไปนี้:

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

โดยทั่วไปแล้วข้อผิดพลาดการทำให้เป็นอนุกรมหรือการดีซีเรียลไลเซชันจะส่งผลให้เกิดไฟล์JsonSerializationException.


9
ขอบคุณ แต่ "โดยทั่วไป"? ฉันจะทราบได้อย่างไรว่า DeseriazeObject มีข้อยกเว้นใดบ้าง
cja

9
@cja ฉันคิดว่ามันจะเป็นJsonSerializationExceptionเช่นนั้นเสมอแต่เพื่อให้แน่ใจว่าคุณจะต้องถามผู้เขียนหรือดูซอร์สโค้ด ... อย่างไรก็ตามคุณสามารถจับได้JsonExceptionว่าคุณต้องการที่จะไม่พลาดอะไรเนื่องจาก JSON ทั้งหมด ข้อยกเว้น. NET สืบทอดมาจากมัน
Thomas Levesque

167
ฉันคิดว่าข้อยกเว้นจำเป็นต้องได้รับการจัดทำเป็นเอกสารอย่างถูกต้อง
KFL

ฉันได้รับรายละเอียดข้อยกเว้นเหมือนกันแม้จะมีคลาส Exception ในบล็อก catch โปรดช่วยฉันทำความเข้าใจวิธีการทำงานของมัน! ในกรณีของฉันตอนนี้ได้รับข้อยกเว้นกับ JSON ที่มี Unicode เครื่องมือออนไลน์สามารถแยกวิเคราะห์ได้อย่างถูกต้อง แต่ล้มเหลวด้วย JSONConvert
Naga

@KFL นั่นเป็นความคิดที่ดีที่คุณไปถึงที่นั่นแล้ว
Mark S

60

โปรดทราบว่าเอกสารคู่มือการจัดการข้อผิดพลาดของ Json.NETแสดงกลยุทธ์สำหรับผู้ใช้ API ในการจัดการกับข้อผิดพลาดโดยจัดการเหตุการณ์ข้อผิดพลาดแทนที่จะจับข้อยกเว้นโดยตรง สิ่งนี้สมเหตุสมผลเมื่อคุณพิจารณาว่าอาจมีเพียงรายการเดียวในอาร์เรย์เท่านั้นที่อาจไม่สามารถ deserialize ได้และคุณอาจต้องการจัดการสิ่งนี้ในลักษณะที่ละเอียดกว่าข้อยกเว้นเสาหินเดียวสำหรับทั้งชุด

คำตอบนี้เน้นส่วนที่ "ต้องการจัดการพวกเขา" ของคำถามของคุณโดยไม่ต้องไปที่ส่วน "ข้อยกเว้นใด" ตามคำตอบอื่นแสดงให้เห็นว่าข้อยกเว้น Json.NET ทั้งหมดสืบทอดมาจากJsonException Classดังนั้นการจับสิ่งนี้จะเป็นการป้องกันความล้มเหลวที่ดี อย่างไรก็ตามดูเหมือนว่าหากคุณต้องการเข้าใจสิ่งที่ทำให้เกิดข้อยกเว้นจริงๆคุณจะต้องอ่านMessageคุณสมบัติไม่ใช่จัดการตามExceptionประเภทเนื่องจากประเภทต่างๆดูเหมือนจะมุ่งเน้นไปที่การกระทำที่คุณกำลังดำเนินการมากกว่า หมวดหมู่ข้อผิดพลาด ในโค้ดตัวอย่างต่อไปนี้args.ErrorContext.Errorเป็นตัวอย่างของException.

ตัวอย่างรหัสจากเอกสารประกอบ:

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.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.