Newtonsoft.Json.DeserializeObject throw มีข้อยกเว้นอะไรบ้าง ฉันต้องการจัดการพวกเขา
Newtonsoft.Json.DeserializeObject throw มีข้อยกเว้นอะไรบ้าง ฉันต้องการจัดการพวกเขา
คำตอบ:
JSON.NET กำหนดข้อยกเว้นต่อไปนี้:
JsonException
JsonReaderException
JsonSerializationException
JsonWriterException
JsonSchemaException
โดยทั่วไปแล้วข้อผิดพลาดการทำให้เป็นอนุกรมหรือการดีซีเรียลไลเซชันจะส่งผลให้เกิดไฟล์JsonSerializationException
.
JsonSerializationException
เช่นนั้นเสมอแต่เพื่อให้แน่ใจว่าคุณจะต้องถามผู้เขียนหรือดูซอร์สโค้ด ... อย่างไรก็ตามคุณสามารถจับได้JsonException
ว่าคุณต้องการที่จะไม่พลาดอะไรเนื่องจาก JSON ทั้งหมด ข้อยกเว้น. NET สืบทอดมาจากมัน
โปรดทราบว่าเอกสารคู่มือการจัดการข้อผิดพลาดของ 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.