JSON使案例不敏感

时间:2017-04-03 15:30:52

标签: c# json.net jsonschema

我试图从我的C#模型中生成一个模式,到目前为止,以下内容进展顺利:

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);

我无法弄清楚的一件事是如何使它不区分大小写。它似乎应该自动执行此操作(首先区分大小写,然后不区分大小写),但对我来说却没有。

关于我缺少的任何想法?

1 个答案:

答案 0 :(得分: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代码并更新它以支持您的功能,直到那时它无法获得您所需的功能。