.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
.NET下 支持大小写不敏感的JSON Schema验证方法的更多相关文章
- Json.Net使用JSON Schema验证JSON格式
Json.NET supports the JSON Schema standard via the JsonSchema and JsonValidatingReader classes. It s ...
- Json.Net使用JSON Schema验证JSON格式【实例】
给出一个Json,验证其格式是否符合规则. { "coord": { //对象 "lon": 145.77, "lat": -16.92 } ...
- PHP大小写是否敏感问题
一.大小写敏感 1. 变量名区分大小写 所有变量均区分大小写,包括普通变量以及$_GET,$_POST,$_REQUEST,$_COOKIE,$_SESSION,$GLOBALS,$_SERVER,$ ...
- 使用JSON Schema来验证接口数据
最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式. 如果之前看我写的<使用joi来验证数据模型 ...
- [转]mysql在windows下支持表名大小写,lower_case_table_names
windows下mysql默认是不支表名大小写的,也就是表名大小写不敏感.用phpmyadmin创建的驼峰式表名,全部被强制成小写.mysql表名大小写敏感的参数: lower_case_table_ ...
- mysql在windows下支持表名大小写,lower_case_table_names
windows下mysql默认是不支表名大小写的,也就是表名大小写不敏感.用phpmyadmin创建的驼峰式表名,全部被强制成小写.mysql表名大小写敏感的参数: lower_case_table_ ...
- Linux环境下修改MySQL数据库对表名大小写不敏感
Linux系统中MySQL对数据库名称和表名是大小写敏感的,这就导致了一些麻烦,虽然已经建立了表和数据,但因为大小写导致无法找到表. MySQL数据库对表名大小写不敏感的设置方法如下: 1.查看MyS ...
- MySQL查询大小写是否敏感问题分析
mysql数据库在做查询时候,有时候是英文字母大小写敏感的,有时候又不是的,主要是由mysql的字符校验规则的设置决定的,通常默认是不支持的大小写字母敏感的. 1. 什么是字符集和校验规则? 字符集 ...
- 将现有MySQL数据库改为大小写不敏感
用过MySQL的应该都会注意到,默认情况下,Linux下安装的MySQL是大小写敏感的,也就是说Table1和table1可以同时存在.而Windows下的MySQL却是大小写不敏感的,所有表名和数据 ...
- Python正则匹配字母大小写不敏感在读xml中的应用
需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: if s == 'abc':#s为需要匹配的字符串 prin ...
随机推荐
- SkiaSharp 渲染输出 SVG 文件
谷歌的 Skia 的一个卖点就是提供了完美的 SVG 的支持,包括输入和输出.输入指的是给一张 SVG 图片,将这个 SVG 渲染出来.输出就是将输出画面保存为 SVG 格式的图片.自然 SkiaSh ...
- 揭露 FileSystem 引起的线上 JVM 内存溢出问题
作者:来自 vivo 互联网大数据团队-Ye Jidong 本文主要介绍了由FileSystem类引起的一次线上内存泄漏导致内存溢出的问题分析解决全过程. 内存泄漏定义(memory leak):一个 ...
- VSCode+VUE+ESLint以达到保存自动格式化
首先打开VSCode在.eslintrc.js中加入以下代码(不知道怎么找可以ctrl+shift+p进行搜索),添加 vscode 终端启动服务 // 添加⾃定义规则 'prettier/prett ...
- gin+grom 求当天的数据列表 0点到24点
框架go-admin gin+gorm mysql表 CREATE TABLE `sq_user_ticket` ( `id` bigint(20) NOT NULL AUTO_INCREMENT C ...
- Java IO流文件
Java IO流文件 创建文件 使用File类进行创建文件操作,创建该对象包含三种构造方法 new File(String pathname); //根据路径+文件名创建一个File对象 new Fi ...
- tarjan板子整理
缩点 stack<int>q; void tarjan(int u) { pre[u]=low[u]=++cnt; q.push(u); vis[u]=1; for(int i=head[ ...
- 一键自动化博客发布工具,用过的人都说好(51cto篇)
51cto是一个优秀的博客平台,今天给大家讲解一下blog-auto-publishing-tools如何自动发布博客到51cto上. 当然在实现过程中有可能会遇到各种困难,不过不用担心,我们一个个来 ...
- uniapp-vue3-oadmin手机后台实例|vite5.x+uniapp多端仿ios管理系统
原创vue3+uniapp+uni-ui跨端仿ios桌面后台OA管理模板Uni-Vue3-WeOS. uniapp-vue3-os一款基于uni-app+vite5.x+pinia等技术开发的仿ios ...
- vue 常用类库引用
js 端生成guid 类库一:https://github.com/uuidjs/uuid npm i uuid --save 类库二:https://github.com/LiosK/ ...
- webview2 示例 Samples Selenium
https://github.com/MicrosoftEdge/WebView2Samples https://learn.microsoft.com/zh-cn/microsoft-edge/we ...