programing

JSON 중 구문 분석 오류를 무시합니다.NET 데이터 해석

minimums 2023. 2. 27. 23:02
반응형

JSON 중 구문 분석 오류를 무시합니다.NET 데이터 해석

데이터 구조가 미리 정의된 개체가 있습니다.

public class A
{
    public string Id {get;set;}
    public bool? Enabled {get;set;}
    public int? Age {get;set;}
}

JSON은 원래

{ "Id": "123", "Enabled": true, "Age": 23 }

JSON 오류를 긍정적인 방법으로 처리하고 서버가 정의된 데이터 유형에 대해 예기치 않은 값을 반환할 때마다 이를 무시하고 기본값을 설정(null)합니다.

현재 JSON이 부분적으로 유효하지 않은 경우 JSON Reader 예외가 발생합니다.

{ "Id": "123", "Enabled": "NotABoolValue", "Age": 23 }

그리고 나는 어떤 물체도 얻지 못한다.내가 원하는 것은 오브젝트를 얻는 것이다.

new A() { Id = "123", Enabled = null, Age = 23 }

및 가능한 경우 구문 분석 경고.JSON으로 달성할 수 있습니까?인터넷?

역직렬화 오류를 처리하려면 다음 코드를 사용합니다.

var a = JsonConvert.DeserializeObject<A>("-- JSON STRING --", new JsonSerializerSettings
    {
        Error = HandleDeserializationError
    });

어디에HandleDeserializationError는 다음 방식입니다.

public void HandleDeserializationError(object sender, ErrorEventArgs errorArgs)
{
    var currentError = errorArgs.ErrorContext.Error.Message;
    errorArgs.ErrorContext.Handled = true;
}

HandleDeserializationErrorjson 문자열에 오류가 있는 횟수만큼 호출됩니다.에러의 원인이 되고 있는 속성은 초기화되지 않습니다.

Ilija의 솔루션과 동일하지만 게으름뱅이/급행자(공로)를 위한 오넬리너

var settings = new JsonSerializerSettings { Error = (se, ev) => { ev.ErrorContext.Handled = true; } };
JsonConvert.DeserializeObject<YourType>(yourJsonStringVariable, settings);

잼을 위한 소품 =)

다른 방법이 있습니다. 예를 들어, 뉴턴 json을 사용하여 탈메랄라이제이션과 세랄라이제이션이 이루어지는 nuget 패키지를 사용하는 경우입니다.패키지가 오류를 처리하지 않으면 이 문제가 발생할 수 있습니다.위의 솔루션을 사용할 수 없습니다.오브젝트 레벨에서 처리해야 합니다.여기서 OnErrorAttribute가 도움이 됩니다.따라서 아래 코드는 모든 속성에 대한 오류를 탐지합니다. OnError 함수 내에서 수정하고 기본값을 할당할 수도 있습니다.

public class PersonError
{
  private List<string> _roles;

  public string Name { get; set; }
  public int Age { get; set; }

  public List<string> Roles
  {
    get
    {
        if (_roles == null)
        {
            throw new Exception("Roles not loaded!");
        }

        return _roles;
    }
    set { _roles = value; }
  }

  public string Title { get; set; }

  [OnError]
  internal void OnError(StreamingContext context, ErrorContext errorContext)
  {
    errorContext.Handled = true;
  }
}

https://www.newtonsoft.com/json/help/html/SerializationErrorHandling.htm 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/26107656/ignore-parsing-errors-during-json-net-data-parsing

반응형