불행히도 JObject.Parse는 아무 것도 변경하지 않습니다.
먼저 스키마를 설정합니다. JSchema는 속성의 내부 사전을 만듭니다.
JSchema schema = generator.Generate(typeof(MyClass));
schema.AllowAdditionalProperties = false;
schema.UniqueItems = false;
필자 만의 표현을 추가하여 테스트하고 클래스를 역 직렬화합니다.
string MyJson = "{\"PROPERTYONE\":\"Data\", \"PropertyTwo\":10}";
클래스는 목적은
public class MyClass
{
public string PropertyOne { get; set; }
public int PropertyTwo { get; set; }
}
는 내부적으로 독자가 만든이 정의를 일치하지 않는에, 당신의 문자열이 전달되고 유효성 검사 스키마 리더는 정의에서 얻을 수있다 :
JsonTextReader reader = new JsonTextReader(new StringReader(MyJson));
JSchemaValidatingReader validatingReader = new JSchemaValidatingReader(reader);
validatingReader.Schema = JSchema.Parse(schema.ToString());
유효성 검사 메시지를받을 수 있도록 유효성 검사기의 모든 유효성 검사를 트리거하는 이벤트에 수동으로 연결하는 메시지를 작성했습니다 :
IList<string> messages = new List<string>();
validatingReader.ValidationEventHandler += (o, a) => messages.Add(a.Message);
당신은 작동 및 역 직렬화가 케이스에 대해 상관하지 않기 때문에 클래스를 채 웁니다하지만 유효성 검사 판독기가 버블 검증 실패
JsonSerializer serializer = new JsonSerializer();
MyClass p = serializer.Deserialize<MyClass>(validatingReader);
에 가고 클래스를 직렬화하는 시리얼 라이저를 사용하는 경우 유효성 검사는 다음과 같은 부분에 실패 검증 프로세스의
내부 : 속성 이름이 사전에 비교됩니다
private bool IsPropertyDefinied(JSchema schema, string propertyName)
{
if (schema._properties != null && schema._properties.ContainsKey(propertyName))
{
return true;
}
...
. 이 사전은 일반 사전이며, InvariantCultureIgnoreCase 속성을 사용하지 않아서 (사용자가 요청한대로) 정확하게 비교할 수 있습니다. 유일한 방법은 GitHub 코드를 가져 와서 해당 기능을 지원하도록 업데이트하는 것입니다. 그때까지는 불가능합니다. 당신이 필요로하는 것을 얻기 위해서.