JSON 不区分大小写
JSON make case insensitive
我正在尝试从我的 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);
我一直想不通的一件事是如何让它不区分大小写。它似乎应该自动执行此操作(首先区分大小写,然后不区分大小写)但对我来说它不会。
关于我遗漏的任何想法?
不幸的是 JObject.Parse 不允许您更改任何内容。
首先,您设置架构。 JSchema 创建一个内部属性字典。
JSchema schema = generator.Generate(typeof(MyClass));
schema.AllowAdditionalProperties = false;
schema.UniqueItems = false;
我添加了自己的表示只是为了测试它并执行 class 反序列化。
string MyJson = "{\"PROPERTYONE\":\"Data\", \"PropertyTwo\":10}";
class 是故意不符合这个定义
public class MyClass
{
public string PropertyOne { get; set; }
public int PropertyTwo { get; set; }
}
在内部创建一个 reader,传递您的字符串并从您的定义中获取验证模式 reader:
JsonTextReader reader = new JsonTextReader(new StringReader(MyJson));
JSchemaValidatingReader validatingReader = new JSchemaValidatingReader(reader);
validatingReader.Schema = JSchema.Parse(schema.ToString());
我已经创建了手动挂钩到触发验证中的每个验证的事件的消息 reader 所以你得到你的验证消息:
IList<string> messages = new List<string>();
validatingReader.ValidationEventHandler += (o, a) => messages.Add(a.Message);
如果你使用序列化程序反序列化你的 class 它会工作并填充 class 因为反序列化不关心大小写,但是你的验证 reader 将会冒泡验证失败
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 代码并更新它以支持您的功能,在此之前无法获得您需要的东西。
我正在尝试从我的 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);
我一直想不通的一件事是如何让它不区分大小写。它似乎应该自动执行此操作(首先区分大小写,然后不区分大小写)但对我来说它不会。
关于我遗漏的任何想法?
不幸的是 JObject.Parse 不允许您更改任何内容。
首先,您设置架构。 JSchema 创建一个内部属性字典。
JSchema schema = generator.Generate(typeof(MyClass));
schema.AllowAdditionalProperties = false;
schema.UniqueItems = false;
我添加了自己的表示只是为了测试它并执行 class 反序列化。
string MyJson = "{\"PROPERTYONE\":\"Data\", \"PropertyTwo\":10}";
class 是故意不符合这个定义
public class MyClass
{
public string PropertyOne { get; set; }
public int PropertyTwo { get; set; }
}
在内部创建一个 reader,传递您的字符串并从您的定义中获取验证模式 reader:
JsonTextReader reader = new JsonTextReader(new StringReader(MyJson));
JSchemaValidatingReader validatingReader = new JSchemaValidatingReader(reader);
validatingReader.Schema = JSchema.Parse(schema.ToString());
我已经创建了手动挂钩到触发验证中的每个验证的事件的消息 reader 所以你得到你的验证消息:
IList<string> messages = new List<string>();
validatingReader.ValidationEventHandler += (o, a) => messages.Add(a.Message);
如果你使用序列化程序反序列化你的 class 它会工作并填充 class 因为反序列化不关心大小写,但是你的验证 reader 将会冒泡验证失败
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 代码并更新它以支持您的功能,在此之前无法获得您需要的东西。