2017-04-03 47 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代码并更新它以支持你的功能,直到那时不可能获得你所需要的东西。