问题

对于验证复杂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 验证器的更多相关文章

  1. Json.Net使用JSON Schema验证JSON格式

    Json.NET supports the JSON Schema standard via the JsonSchema and JsonValidatingReader classes. It s ...

  2. Json.Net使用JSON Schema验证JSON格式【实例】

    给出一个Json,验证其格式是否符合规则. { "coord": { //对象 "lon": 145.77, "lat": -16.92 } ...

  3. Postman使用tv4进行JSON Schema结构验证和断言

    JSON Scheme简介 对于JSON格式的请求数据或者响应数据,在不同的数据和场景下往往会有一部分动态的值及字段.此时我们可以使用JSON Scheme Validator(JSON结构验证)来验 ...

  4. 使用JSON Schema来验证接口数据

    最近在做一些关于JSON Schema的基建,JSON Schema可以描述一个JSON结构,那么反过来他也可以来验证一个JSON是否符合期望的格式. 如果之前看我写的<使用joi来验证数据模型 ...

  5. XML Schema验证

    XML Schema验证 一.什么事Schema(XSD) XML Schema是微软定义的一套用来验证XML技术.是一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模 ...

  6. JSON Schema(模式)

    JSON Schema指的是数据交换中的一种虚拟的“合同”. JSON验证器负责验证语法错误,JSON Schema负责提供一致性检验. JSON Schema是数据接收方额第一道防线,也是数据发送方 ...

  7. 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 ...

  8. Node教程——封装一个token验证器

    重要说明 这个轮子是 使用 express@5.0 + MongoDB构建起来的一个 node后台通用的验证器,里面主要讲的就是使用jwt,token进行验证,当然你想使用session也没问题,但是 ...

  9. Understanding JSON Schema

    json schema 在线校验器 译自:Understanding JSON Schema { "type": "object", "propert ...

  10. 原生JS 表单提交验证器

    转载:http://www.cnblogs.com/sicd/p/4613628.html 一.前言 最近在开发一个新项目,需要做登陆等一系列的表单提交页面.在经过“缜密”的讨论后,我们决定 不用外部 ...

随机推荐

  1. electron 关于jquery不可以用

    前言 electron 实际是在google 内核上开发,实际上和我们在浏览器还是有些区别的. jquery 在electron 上引用是会出错的. 正文 解决方案 如果不做任何操作,在Electro ...

  2. 利用PyTorch训练模型识别数字+英文图片验证码

    利用PyTorch训练模型识别数字+英文图片验证码 摘要:使用深度学习框架PyTorch来训练模型去识别4-6位数字+字母混合图片验证码(我们可以使用第三方库captcha生成这种图片验证码或者自己收 ...

  3. .NET8中的Microsoft.Extensions.Http.Resilience库

    接上一篇,https://www.cnblogs.com/vipwan/p/18129361 借助Aspire中新增的Microsoft.Extensions.ServiceDiscovery库,我们 ...

  4. Spring JDBCTemplet通用RowMapper帮助类

    1 import java.lang.reflect.Method; 2 import java.math.BigDecimal; 3 import java.math.BigInteger; 4 i ...

  5. 安装Visual Studio 2010 教程

    1.下载软件 方法一:关注[ 火耳软件安装 ]公众号获取软件,里面还有很多类型的其他软件 或者: 方法二:我的分享链接:https://pan.baidu.com/s/1_Ow2YR-kbnbSc6o ...

  6. 力扣525(java&python)-连续数组(中等)

    题目: 给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度. 示例 1: 输入: nums = [0,1]输出: 2说明: [0, 1] 是具有相 ...

  7. OpenTK 垂直同步对刷新率的影响

    本文将和大家介绍 Vsync 垂直同步的开启对 OpenTK 应用的刷新率的影响 在上一篇博客 OpenTK 入门 初始化窗口 告诉了大家如何初始化 OpenTK 承载 OpenGL 的窗口的应用,在 ...

  8. vim 使用black 格式化python代码

    vim 使用black 格式化代码 github black 的github https://github.com/psf/black 安装 pip3 install black 使用 black f ...

  9. Oracle细粒度审计策略

    场景:经常需要查看某些表做了哪些操作. Oracle中,可以添加细粒度策略来获取,如下: begin dbms_fga.add_policy(object_schema => 'portxx', ...

  10. 为什么需要学习ITSM/ITIL

    假如你需要管理一个超过20人的IT服务组织,一般会面临以下问题: 人多事杂活重,每个人都很累,工作却还是一团糟糕, 用户方怨声载道,领导也颇有微词,同事间也经常互相甩锅埋坑, 工作只是救火或者混日子, ...