用.NET代碼生成JSON Schema 驗證器

来源:https://www.cnblogs.com/dotnet-diagnostic/p/18224293
-Advertisement-
Play Games

問題 對於驗證複雜JSON數據是否合法的需求,通常的解決方式是標準JSON Schema,.Net下有對應的JSON Schema實現庫。應用程式通常需要將標準JSON schema傳入實現庫,來做後續的數據驗證。這裡有一種情況,就是如果使用者不太瞭解標準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。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在項目中,為了演算法結果的可視化,需要用到混淆矩陣(Confusion Matrix),而網上資源大多是基於Python繪製的混淆矩陣,並且是輸出圖片格式,並不能響應用戶點擊,今天以一個簡單的小例子,簡述如何通過WPF繪製混淆矩陣,並可響應用戶點擊事件,僅供學習分享使用,如有不足之處,還請指正。 ...
  • ReZero AP ReZero是一款.NET中間件 : 一款通過界面操作就能生成API , 可以集成到任何.NET6+ API項目,無破壞性,也可讓非.NET用戶使用exe文件 ReZero生成器功能簡介 1、表文檔導出:支持目錄導航 2、線上創建表、線上建庫 3、一鍵導入現有表 4、模版線上調試 ...
  • DeveloperSharp系列近期又被製造業ERP、民航飛行App、建築BIM、電力掌上營業廳、等多家大型採用,站在巨人的肩膀上你能走的更遠。 支持.Net Core2.0及以上,支持.Net Framework4.0及以上 數據分頁,幾乎是任何應用系統的必備功能。但當數據量較大時,分頁操作的效率 ...
  • 為什麼0.1 + 0.2 不等於 0.3?為什麼16777216f 等於 16777217f?為什麼金錢計算都推薦用decimal?本文主要學習瞭解一下數字背後不為人知的存儲秘密。 ...
  • OpenTelemetry 簡介 OpenTelemetry 是一個由 CNCF(Cloud Native Computing Foundation)托管的開源項目,旨在為觀察性(Observability)提供一套全面的工具,包括度量(Metrics)、日誌(Logs)和追蹤(Traces)。它的 ...
  • 先上兩個通用Modbus幫助類,下麵這個是多線程不安全版,在多線程多電機同一埠通信下,可能造成步進電機丟步或者輸出口無響應等,還有個多線程安全版,只是基於這個不安全版加上了LOCK,THIS using Modbus.Device; using Sunny.UI; using System; us ...
  • 最近在項目中,業務上需要與Python進行交互,而Python程式用的配置文件主要是YAML,程式以命令行形式運行,前端頁面由C#通過WPF開發完成。現在需要通過C#生成YAML配置文件,並經過Python讀取和修改後,再次由C#進行讀取。在C#開發程式中,主要用的配置文件主要是XML,JSON,I... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他的軟體在客戶那邊不知道什麼原因崩掉了,從windows事件日誌看崩潰在 clr 里,讓我能否幫忙定位下,dump 也抓到了,既然dump有了,接下來就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼崩潰在 clr 一般來說崩潰在clr ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...