Newtonsoft.Json.DeserializeObject có những ngoại lệ nào?


Câu trả lời:


124

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.


9
Cảm ơn, nhưng "thông thường"? Làm cách nào tôi có thể tìm ra một số ngoại lệ mà DeseriazeObject ném ra?
cja

9
@cja, tôi nghĩ sẽ luôn như vậy 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 JsonExceptionnế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ó.
Thomas Levesque

167
Tôi nghĩ rằng các trường hợp ngoại lệ cần được ghi lại một cách hợp lý.
KFL

Tôi nhận được cùng một chi tiết ngoại lệ, ngay cả với lớp Ngoại lệ trong khối bắt, bạn có thể vui lòng giúp tôi hiểu cách chúng hoạt động không! Trong trường hợp của tôi hiện đang có ngoại lệ với JSON có unicode, công cụ trực tuyến có thể phân tích cú pháp chính xác nhưng không thành công với JSONConvert
Naga

@KFL thật tuyệt vì bạn đã đến đó rồi anh bạn
Mark S

60

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 Exceptionloạ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.Errorví 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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.