Newtonsoft.Json.DeserializeObject가 던지는 예외는 무엇입니까?


답변:


124

JSON.NET은 다음 예외를 정의합니다.

  • JsonException
    • JsonReaderException
    • JsonSerializationException
    • JsonWriterException
    • JsonSchemaException

직렬화 또는 역 직렬화 오류는 일반적으로 JsonSerializationException.


9
고맙지 만 "일반적으로"? DeseriazeObject가 던지는 예외를 어떻게 알 수 있습니까?
cja 2014.10.09

9
@cja, 나는 항상 될 것이라고 생각JsonSerializationException 하지만 저자에게 물어 보거나 소스 코드를 조사해야 할 것입니다 ... 어쨌든, JsonException모든 JSON 이후 아무것도 놓치지 않으려면 잡을 수 있습니다. .NET 예외는 여기에서 상속됩니다.
Thomas Levesque 2014 년

167
예외는 적절하게 문서화되어야한다고 생각합니다.
KFL

catch 블록의 Exception 클래스를 사용하더라도 동일한 예외 세부 정보를 얻습니다. 작동 방식을 이해하도록 도와주세요! 제 경우에는 지금 유니 코드가있는 JSON 예외가 발생하고, 온라인 도구는 올바르게 구문 분석 할 수 있지만 JSONConvert로 실패합니다
Naga

@ KFL 그게 좋은 생각 u가 거기 형제
Mark S

60

참고 문서 처리 Json.NET의 오류 는 API 사용자 쇼에게 전략이 오류 이벤트를 처리하기보다는 직접 예외를 잡기하여 오류를 처리 할 수 있습니다. 이는 배열의 한 항목 만 역 직렬화에 실패 할 수 있으며 전체 집합에 대한 하나의 모 놀리 식 예외보다 더 세분화 된 방식으로 처리 할 수 ​​있다고 생각할 때 의미가 있습니다.

이 답변은 "어떤 예외 사항"부분에 들어 가지 않고 질문의 "처리하고 싶은 부분"부분을 다룹니다. 또 다른 답변에서 알 수 있듯이 모든 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.