【问题标题】:JSON make case insensitiveJSON 不区分大小写
【发布时间】:2017-04-03 15:30:52
【问题描述】:

我正在尝试从我的 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);

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

关于我缺少什么的任何想法?

【问题讨论】:

    标签: c# json.net jsonschema


    【解决方案1】:

    不幸的是,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 代码并更新它以支持您的功能,在此之前无法获得您需要的东西。

    【讨论】:

      猜你喜欢
      • 2012-03-15
      • 1970-01-01
      • 2012-12-01
      • 2013-03-06
      • 2020-02-18
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多