Newtonsoft.Json.DeserializeObject có những ngoại lệ nào? Tôi muốn xử lý chúng.
Newtonsoft.Json.DeserializeObject có những ngoại lệ nào? Tôi muốn xử lý chúng.
Câu trả lời:
JSON.NET xác định các ngoại lệ sau:
JsonException
JsonReaderException
JsonSerializationException
JsonWriterException
JsonSchemaException
Lỗi tuần tự hóa hoặc giải mã hóa thường sẽ dẫn đến a JsonSerializationException
.
JsonSerializationException
, nhưng để chắc chắn, bạn sẽ phải hỏi tác giả hoặc xem mã nguồn ... Dù sao, bạn có thể nắm bắt JsonException
nếu bạn muốn chắc chắn không bỏ lỡ bất kỳ điều gì, vì tất cả JSON .NET ngoại lệ kế thừa từ nó.
Lưu ý rằng tài liệu xử lý lỗi của Json.NET cho thấy một chiến lược để người dùng API đối phó với lỗi bằng cách xử lý các sự kiện lỗi thay vì trực tiếp bắt các ngoại lệ. Điều này có ý nghĩa khi bạn cân nhắc rằng có lẽ chỉ một mục trong một mảng có thể không giải được kích thước và bạn có thể muốn xử lý điều này theo cách chi tiết hơn là một ngoại lệ nguyên khối cho toàn bộ tập hợp.
Câu trả lời này giải quyết phần "muốn xử lý chúng" trong câu hỏi của bạn mà không đi vào phần "ngoại lệ nào". Như một câu trả lời khác cho thấy, tất cả các ngoại lệ Json.NET đều kế thừa từ Lớp JsonException , vì vậy việc nắm bắt điều này sẽ là một biện pháp an toàn cho sự cố. Tuy nhiên, có vẻ như nếu bạn muốn thực sự hiểu điều gì đã gây ra một ngoại lệ được ném ra, bạn sẽ cần phải đọc thuộc tính của nó Message
, không phải xử lý dựa trên Exception
loại, vì các loại khác nhau dường như hướng nhiều hơn vào hành động bạn đang thực hiện hơn danh mục lỗi. Trong đoạn mã ví dụ sau, args.ErrorContext.Error
ví dụ của Exception
.
Mã ví dụ từ tài liệu:
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.