2017-12-05 10 views
0

Json.NET Schema .NET 라이브러리를 사용하고 있습니다.Json.NET 스키마 : 사용자 정의 JSON 유효성 검사 규칙을 사용할 때 사용자 정의 오류 유형

JSchema schema = JSchema.Parse(@"{ 
    'type': 'object', 
    'required' : ['name'], 
    'properties': { 
     'name': {'type':'string'}, 
     'roles': {'type': 'array'} 
    } 
}"); 

지금 내가 JSON 개체 (나는 name 속성을 정의하고 있지 않다주의)을 검증하고 있습니다 :

의 나는 같은 JSON 스키마를 정의한다고 가정 해 봅시다

JObject user = JObject.Parse(@"{ 
    'roles': ['Developer', 'Administrator'] 
}"); 

user.IsValid(schema, out IList<ValidationError> errors); 

Debug.WriteLine(errors[0].ErrorType); 

마지막 행의 출력은 Required이됩니다. 이렇게하면 런타임에 특정 오류 유형을 알 수 있으며 프로그래밍 방식으로이 오류 유형에 따라 결정을 내릴 수 있습니다.

내 문제는 사용자 지정 유효성 검사 규칙을 사용하여 작업 할 때 사용자 지정 오류 유형을 정의 할 수 없다는 것입니다.

사용자 지정 유효성 검사 규칙 정의 :

class MyCustomValidator : JsonValidator 
{ 
    public override void Validate(JToken value, JsonValidatorContext context) 
    { 
     var s = value.ToString(); 
     if (s != "valid") 
     { 
      context.RaiseError($"Text '{s}' is not valid."); 
     } 

    } 

    public override bool CanValidate(JSchema schema) 
    { 
     return schema.Type == JSchemaType.String; 
    } 
} 

및 사용자 지정 유효성 검사 규칙을 사용하여 유효성 검사를 실행 그래서 내 모든 사용자 지정 유효성 검사기는 다음 예에서와 같이, Validator에 동일 ErrorType 속성 오류 인스턴스를 생성합니다 :

JSchema schema = JSchema.Parse(@"{ 
    'type': 'object', 
    'required' : ['name'], 
    'properties': { 
    'name': {'type':'string'}, 
    'roles': {'type': 'array'} 
    } 
}"); 

JObject user = JObject.Parse(@"{ 
    'name': 'Ivalid', 
    'roles': ['Developer', 'Administrator'] 
}"); 

schema.Validators.Add(new MyCustomValidator()); // adding custom validation rule 

user.IsValid(schema, out IList<ValidationError> errors); 

Debug.WriteLine(errors[0].ErrorType); 

출력은 Validator입니다.

내 질문은 :이 경우에 대한 해결 방법이 있습니까? 내 사용자 정의 유효성 검사 규칙에 의해 생성 된 오류를 다른 표준 오류 유형과 구분할 수 있습니까?

감사합니다.

답변

0

저에게 열어 둔 Github issue에있는 Json.NET Schema의 저자로부터 피드백을 받았습니다. 저자는 말한다 : 런타임에 새 값을 정의하는 방법이되지 않도록

안녕

ERRORTYPE은 열거입니다. 오류에 대한 정보를 메시지에 포함시키고 내용을 테스트해야합니다.

즉 : 현재 런타임에 오류 유형 속성을 사용자 정의 할 수있는 방법이 없습니다.