用.NET代码生成JSON Schema 验证器
问题
对于验证复杂JSON数据是否合法的需求,通常的解决方式是标准JSON Schema,.Net下有对应的JSON Schema实现库。应用程序通常需要将标准JSON schema传入实现库,来做后续的数据验证。这里有一种情况,就是如果使用者不太了解标准JSON Schema格式,但又希望能在自己的service中使用其强大的功能,或者适配需要JSON Schema的其他service。
解决方案
如果不熟悉标准JSON Schema,可以用Lateapexearlyspeed.Json.Schema 实现库的 fluent schema builder模式 来创建 JSON Schema 验证器。
这种fluent schema builder用法的接口设计思路是不完全与标准json schema的格式和命名保持一致。标准JSON Schema虽然强大,但大多开发者一般更熟悉“强类型”风格,因此实现库的fluent schema builder在配置时会先“问”用户他们期望哪种JSON token类型,然后在后续链式调用时会基于当前限定的JSON token类型继续“追问”相关的验证需求。通过这种调用方式,开发者会写出更安全的验证代码,利用IDE也会有更友好的使用体验。如下:
var b = new JsonSchemaBuilder();
b.ObjectHasProperty("A", b => b.IsJsonString().HasMinLength(5))
.HasProperty("B", b => b.IsJsonNumber().IsGreaterThan(1).IsLessThan(10))
.HasProperty("C", b => b.IsJsonArray().HasMinLength(5).HasItems(b =>
{
b.NotJsonNull();
}))
.HasProperty("D", b => b.Or(
b => b.IsJsonFalse(),
b => b.IsJsonNumber().Equal(0),
b => b.IsJsonObject().HasCustomValidation((JsonElement element) => element.GetProperty("Prop").ValueKind == JsonValueKind.True,
jsonElement => $"Cannot pass my custom validation, data is {jsonElement}")
)
);
JsonValidator jsonValidator = b.BuildValidator();
jsonValidator.Validate(...);
看起来风格是不是很熟悉,即使没接触过JSON Schema,相信也能理解上面的.Net代码。
目前 fluent schema builder 模式下支持的验证方法:
- NotJsonNull
- IsJsonTrue
- IsJsonFalse
- IsJsonBoolean
- IsJsonNull
- IsJsonString:
- Equal
- IsIn
- HasMaxLength
- HasMinLength
- HasPattern
- HasCustomValidation
- NotMatch
- EndsWith
- StringEqual
- StringHasPattern
- IsJsonNumber:
- Equal
- IsIn
- IsGreaterThan
- IsLessThan
- NotGreaterThan
- NotLessThan
- MultipleOf
- HasCustomValidation
- IsJsonArray:
- SerializationEquivalent
- HasItems
- HasLength
- HasMaxLength
- HasMinLength
- HasUniqueItems
- HasCustomValidation
- Contains
- NotContains
- Equivalent
- HasCollection
- Empty
- NotEmpty
- Single
- ArrayHasItems
- ArrayContains
- IsJsonObject:
- SerializationEquivalent
- HasProperty
- HasCustomValidation
- Equivalent
- HasNoProperty
- ObjectHasProperty
- Or
其中还有HasCustomValidation() overloads 重载方法可以为 JSON树中的指定节点 创建更高级的自定义验证需求。
不仅想验证JSON数据,还想用 代码Build出来的 Json验证器 来生成 JSON Schema ?
也可以的
string standardJsonSchema = jsonValidator.GetStandardJsonSchemaText();
注意:
为了支持更高级和友好的验证体验,虽然 Lateapexearlyspeed.Json.Schema 实现库在其内部实现时尽可能使用标准JSON Schema keywords, 但一些Build方法会用到“扩展”keywords,因此当你用了那些Build()生成了 JsonValidator 实例后, 将不支持调用 GetStandardJsonSchemaText(),因为扩展keywords无法放回标准JSON Schema且被其他application 所认识,如下:
var builder = new JsonSchemaBuilder();
builder.IsJsonNumber().HasCustomValidation((double _) => true, _ => "");
JsonValidator jsonValidator = builder.BuildValidator();
Assert.Throws<NotSupportedException>(() => jsonValidator.GetStandardJsonSchemaText());
牵扯到扩展keywords的Build方法有:
- HasCustomValidation(...)
- HasNoProperty()
- NotContains()
- StartsWith()
- EndsWith()
总结
对于验证JSON数据方面的复杂需求,可以用JSON Schema解决。
对于不希望直接交互JSON Schema格式的service来说,可以用.Net下的 Lateapexearlyspeed.Json.Schema 实现库的 fluent schema builder模式,通过写代码的形式生成JSON验证器。
对于希望用强类型风格的代码生成JSON Schema的需求,也可以用 Lateapexearlyspeed.Json.Schema 实现库的 fluent schema builder模式。
Github repo: https://github.com/lateapexearlyspeed/Lateapexearlyspeed.JsonSchema, 欢迎将使用时发现的问题提到issue。
用.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 } ...
- Postman使用tv4进行JSON Schema结构验证和断言
JSON Scheme简介 对于JSON格式的请求数据或者响应数据,在不同的数据和场景下往往会有一部分动态的值及字段.此时我们可以使用JSON Scheme Validator(JSON结构验证)来验 ...
- 使用JSON Schema来验证接口数据
最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式. 如果之前看我写的<使用joi来验证数据模型 ...
- XML Schema验证
XML Schema验证 一.什么事Schema(XSD) XML Schema是微软定义的一套用来验证XML技术.是一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模 ...
- JSON Schema(模式)
JSON Schema指的是数据交换中的一种虚拟的“合同”. JSON验证器负责验证语法错误,JSON Schema负责提供一致性检验. JSON Schema是数据接收方额第一道防线,也是数据发送方 ...
- Json schema 以及在python中的jsonschema
目录 1. JSON Schema简介 2. JSON Schema关键字详解 2.1 $schema 2.2 title和description 2.3 type 3 type常见取值 3.1 当t ...
- Node教程——封装一个token验证器
重要说明 这个轮子是 使用 express@5.0 + MongoDB构建起来的一个 node后台通用的验证器,里面主要讲的就是使用jwt,token进行验证,当然你想使用session也没问题,但是 ...
- Understanding JSON Schema
json schema 在线校验器 译自:Understanding JSON Schema { "type": "object", "propert ...
- 原生JS 表单提交验证器
转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...
随机推荐
- python3 引入requests报错ImportError的处理方案
执行python3 import requests时抛出错误:ImportError: No module named requests 使用python3写爬虫时,有些小伙伴会遇到这种坑,使用发现导 ...
- .NET Emit 入门教程:第六部分:IL 指令:8:详解 ILGenerator 指令方法:类型转换指令
前言: 经过前面几篇的学习,我们了解到指令的大概分类,如: 参数加载指令,该加载指令以 Ld 开头,将参数加载到栈中,以便于后续执行操作命令. 参数存储指令,其指令以 St 开头,将栈中的数据,存储到 ...
- 老夫当年手写的js动画库
前言 当年我学习js的时候,那时候学生时代不知道有jquery,所以手写了一些东西,留下的不多作为回忆. 正文 ``` javascript window.onload = function () { ...
- 【进阶篇】Java 实际开发中积累的几个小技巧(二)
目录 前言 六.自定义注解 6.1定义注解 6.2切面实现 6.3业务使用 七.抽象类和接口 7.1隔离业务层与 ORM 层 7.2隔离子系统的业务实现 7.3选择对比 文章小结 前言 笔者目前从事一 ...
- 关于伺服刹车/急停/前后设备信号对接/PLC输入输出模块的公共端介绍
一.伺服刹车 关键词:急停,急停中间继电器.刹车中间继电器,刹车使能 正文: 通常情况不用硬件为主导而用程序来主导控制,多场景应用方便修改且安全可靠. 伺服刹车硬件,一般是24v电源给进去,就会释放刹 ...
- JavaScript中如何实现函数缓存?有哪些应用场景?
一.是什么 函数缓存,就是将函数运算过的结果进行缓存 本质上就是用空间(缓存存储)换时间(计算过程) 常用于缓存数据计算结果和缓存对象 const add = (a,b) => a+b;cons ...
- 力扣615(MySQL)-平均工资:部门与公司比较(困难)
题目: 给如下两个表,写一个查询语句,求出在每一个工资发放日,每个部门的平均工资与公司的平均工资的比较结果 (高 / 低 / 相同). 表: salary employee_id 字段是表 emplo ...
- 力扣1668(java&python)-最大重复子字符串(简单)
题目: 给你一个字符串 sequence ,如果字符串 word 连续重复 k 次形成的字符串是 sequence 的一个子字符串,那么单词 word 的 重复值为 k .单词 word 的 最大重复 ...
- Service Mesh 从“趋势”走向“无聊”
简介: 过去一年,阿里巴巴在 Service Mesh 的探索道路上依旧扎实前行,这种坚定并非只因坚信 Service Mesh 未来一定是云计算基础技术的关键组成部分,还因需要借这一技术趋势去偿还过 ...
- Quick BI的可视分析之路
简介: Quick BI是专为云上用户量身打造的智能数据分析和可视化BI产品,帮助企业快速完成从传统的数据分析到数据云化+分析云化的转变,将企业的业务数据产出后以最快的速度被推送到各组织侧消费使用.本 ...