2017-04-03 2 views
2

나는 내 C# 모델에서 스키마를 생성하기 위해 노력하고있어, 지금까지 일을 다음과 같이 잘 진행됩니다JSON 메이크업 케이스

JSchemaGenerator generator = new JSchemaGenerator(); 

JSchema schema = generator.Generate(typeof(MyClass)); 

schemachema.AllowAdditionalProperties = false; 
schemachema.UniqueItems = false; 

JObject update = JObject.Parse(@"{MYJSON}"); 

IList<string> messages; 
bool IsValid = update.IsValid(clientSchema, out messages); 

내가 알아낼 수 없었던 한 가지입니다 대소 문자를 구분하지 않는 방법. 이 작업은 자동으로 수행되어야합니다 (대소 문자를 구분 한 후 대소 문자를 구분하지 않음). 그러나 나에게는 그렇지 않습니다.

제가 누락 된 것에 대한 아이디어가 있습니까?

답변

2

불행히도 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 코드를 가져 와서 해당 기능을 지원하도록 업데이트하는 것입니다. 그때까지는 불가능합니다. 당신이 필요로하는 것을 얻기 위해서.