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

简介: 有很多应用程序在验证JSON数据的时候用到了JSON Schema。在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用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

相关文章
|
6天前
|
JSON 中间件 Java
【GoGin】(3)Gin的数据渲染和中间件的使用:数据渲染、返回JSON、浅.JSON()源码、中间件、Next()方法
我们在正常注册中间件时,会打断原有的运行流程,但是你可以在中间件函数内部添加Next()方法,这样可以让原有的运行流程继续执行,当原有的运行流程结束后再回来执行中间件内部的内容。​ c.Writer.WriteHeaderNow()还会写入文本流中。可以看到使用next后,正常执行流程中并没有获得到中间件设置的值。接口还提供了一个可以修改ContentType的方法。判断了传入的状态码是否符合正确的状态码,并返回。在内部封装时,只是标注了不同的render类型。再看一下其他返回的类型;
85 4
|
6月前
|
JSON JavaScript 数据格式
何如定义 JSON Schema 并验证该 json 数据?
本文定义了一个包含 audio 和 tags 两个必需属性的 JSON Schema,用于规范数据结构。其中,audio 是非空字符串,表示音频组件;tags 是非空数组,表示标签组件。通过示例数据和验证工具(如 ajv, NJsonSchema),可确保 JSON 数据符合 Schema 要求,从而保障数据的一致性和正确性。
183 1
|
10月前
|
JSON 人工智能 算法
探索大型语言模型LLM推理全阶段的JSON格式输出限制方法
本篇文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
1232 48
|
JSON JavaScript 前端开发
JavaScript实现字符串转json对象的方法
JavaScript实现字符串转json对象的方法
|
11月前
|
JSON 人工智能 算法
探索LLM推理全阶段的JSON格式输出限制方法
文章详细讨论了如何确保大型语言模型(LLMs)输出结构化的JSON格式,这对于提高数据处理的自动化程度和系统的互操作性至关重要。
1848 52
|
11月前
|
JSON JavaScript 前端开发
|
JSON 数据格式 Python
Python编程:利用JSON模块编程验证用户
Python编程:利用JSON模块编程验证用户
101 1
|
XML JSON JavaScript
JSON对象的stringify()和parse()方法使用
本文阐述了JSON对象的`stringify()`和`parse()`方法的用法,包括如何将JavaScript对象转换为JSON字符串,以及如何将JSON字符串解析回JavaScript对象,并讨论了转换过程中需要注意的事项。
JSON对象的stringify()和parse()方法使用
|
存储 JSON JavaScript
|
JSON 开发框架 JavaScript
【Azure Developer】使用.Net Core解析JSON的笔记
【Azure Developer】使用.Net Core解析JSON的笔记
120 1