.NET下 支持大小写不敏感的JSON Schema验证方法

石小疯  金牌会员 | 2024-6-25 10:23:54 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 888|帖子 888|积分 2664

题目

有很多应用步调在验证JSON数据的时候用到了JSON Schema。
在微服务架构下,有时候各个微服务由于各种汗青原因,它们所生成的数据对JSON Object属性名的大小写规则大概并不同一,它们需要消费的JSON数据的属性名大概需要大小写无关。
遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。
解决方案

一种 临时解决方案 是使用JSON Schema中的patternProperties关键字,写正则表达式来表示当前属性名是大小写无关的。
比如你的数据是这样的:
  1. [
  2.   { "Count": 1 },
  3.   { "count": 3 }
  4. ]
复制代码
那么你可以这样写JSON Schema:
  1. {
  2.   "type": "array",
  3.   "items": {
  4.     "patternProperties": {
  5.       "^[Cc]ount$": { "minimum": 1 }
  6.     }
  7.   }
  8. }
复制代码
显然这样的JSON Schema会比原来的更复杂。
更优雅的解决方案

想象一下.NET下的JSON library System.Text.Json,它的反序列化器支持 属性名大小写无关的选项PropertyNameCaseInsensitive,这个是用来反序列化的。
那么,有没有JSON Schema实现库支持大小写无关的扩展选项呢?在.NET下,目前 实现库 Lateapexearlyspeed.Json.Schema支持 属性名大小写无关的 JSON Schema级验证。由于该实现库遵照标准JSON Schema(规定属性名只能大小写敏感),以是这个扩展功能需要显式配置:
  1. /// <summary>
  2. /// Gets or sets a value that determines whether a property's name uses a case-insensitive comparison during validation. The default value is false.
  3. /// </summary>
  4. /// <returns>
  5. /// true to compare property names using case-insensitive comparison; otherwise, false.
  6. /// </returns>
  7. public bool PropertyNameCaseInsensitive { get; set; }
复制代码
例子:
  1. string jsonSchema = """
  2.     {
  3.       "properties": {
  4.         "A": {
  5.                 "properties": {
  6.                   "B": {"type": "string"}
  7.                 }
  8.         }
  9.       }
  10.     }
  11.     """;
  12. string jsonInstance = """
  13.     {
  14.       "a": {
  15.         "b": 123
  16.       }
  17.     }
  18.     """;
  19. // By default, JSON Schema validation is property names case sensitive, so instance data's property names are not matched:
  20. ValidationResult validationResult = new JsonValidator(jsonSchema).Validate(jsonInstance);
  21. Assert.True(validationResult.IsValid);
  22. // Opt in to feature of property names case Insensitive:
  23. validationResult = new JsonValidator(jsonSchema, new JsonValidatorOptions { PropertyNameCaseInsensitive = true }).Validate(jsonInstance);
  24. Assert.False(validationResult.IsValid);
  25. Assert.Equal("Expect type(s): 'String' but actual is 'Number'", validationResult.ErrorMessage);
  26. Assert.Equal("/a/b", validationResult.InstanceLocation!.ToString());
  27. 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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表