.NET下 支持大小写不敏感的JSON Schema验证方法
|
问题
有很多应用程序在验证JSON数据的时候用到了JSON Schema。
在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。
遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。
解决方案
一种 临时解决方案 是利用JSON Schema中的patternProperties关键字,写正则表达式来表示当前属性名是大小写无关的。
比如你的数据是这样的:- [
- { "Count": 1 },
- { "count": 3 }
- ]
复制代码 那么你可以这样写JSON Schema:- {
- "type": "array",
- "items": {
- "patternProperties": {
- "^[Cc]ount$": { "minimum": 1 }
- }
- }
- }
复制代码 显然这样的JSON Schema会比原来的更复杂。
更优雅的解决方案
想象一下.NET下的JSON library System.Text.Json,它的反序列化器支持 属性名大小写无关的选项PropertyNameCaseInsensitive,这个是用来反序列化的。
那么,有没有JSON Schema实现库支持大小写无关的扩展选项呢?在.NET下,目前 实现库 Lateapexearlyspeed.Json.Schema支持 属性名大小写无关的 JSON Schema级验证。由于该实现库遵循标准JSON Schema(规定属性名只能大小写敏感),所以这个扩展功能需要显式配置:- /// <summary>
- /// Gets or sets a value that determines whether a property's name uses a case-insensitive comparison during validation. The default value is false.
- /// </summary>
- /// <returns>
- /// true to compare property names using case-insensitive comparison; otherwise, false.
- /// </returns>
- public bool PropertyNameCaseInsensitive { get; set; }
复制代码 例子:- string jsonSchema = """
- {
- "properties": {
- "A": {
- "properties": {
- "B": {"type": "string"}
- }
- }
- }
- }
- """;
- string jsonInstance = """
- {
- "a": {
- "b": 123
- }
- }
- """;
- // By default, JSON Schema validation is property names case sensitive, so instance data's property names are not matched:
- ValidationResult validationResult = new JsonValidator(jsonSchema).Validate(jsonInstance);
- Assert.True(validationResult.IsValid);
- // Opt in to feature of property names case Insensitive:
- validationResult = new JsonValidator(jsonSchema, new JsonValidatorOptions { PropertyNameCaseInsensitive = true }).Validate(jsonInstance);
- Assert.False(validationResult.IsValid);
- Assert.Equal("Expect type(s): 'String' but actual is 'Number'", validationResult.ErrorMessage);
- Assert.Equal("/a/b", validationResult.InstanceLocation!.ToString());
- Assert.Equal("/properties/A/properties/B/type", validationResult.RelativeKeywordLocation!.ToString());
复制代码 总结
本文介绍了.NET下 实现属性名大小写无关的JSON Schema验证方法,其中最优雅的方式应该是用 .NET实现库 Lateapexearlyspeed.Json.Schema中的扩展选项 PropertyNameCaseInsensitive。
欢迎大家将使用过程中发现的问题报到repo issue,希望.NET实现库 Lateapexearlyspeed.Json.Schema 能帮到大家。
Github repo: https://github.com/lateapexearlyspeed/Lateapexearlyspeed.JsonSchema
来源:https://www.cnblogs.com/dotnet-diagnostic/p/18261226
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|
|
|
发表于 2024-6-25 15:28:26
举报
回复
分享
|
|
|
|