用.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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...