JSON Schema 入門指南:如何定義和驗證 JSON 數據結構

文章目錄

  • 一、引言
  • 二、什么是 JSON Schema?
  • 三、JSON Schema 的基本結構
    • 3.1 基本關鍵字
    • 3.2 對象屬性
    • 3.3 數組元素
    • 3.4 字符串約束
    • 3.5 數值約束
  • 四、示例:定義一個簡單的 JSON Schema
  • 五、使用 JSON Schema 進行驗證
  • 六、實戰效果
    • 6.1 如何使用
  • 七、總結


一、引言

在現代的 Web 開發和數據交換中,JSON(JavaScript Object Notation)已經成為了一種非常流行的數據格式。它輕量、易讀、易于解析,廣泛應用于 API 通信、配置文件、數據存儲等場景。然而,隨著 JSON 數據結構的復雜性增加,如何確保 JSON 數據的有效性和一致性成為了一個挑戰。這時,JSON Schema 就派上了用場。

本文將帶你入門 JSON Schema,幫助你理解它的基本概念、語法結構,并通過實例演示如何使用 JSON Schema 來定義和驗證 JSON 數據結構。

在這里插入圖片描述

二、什么是 JSON Schema?

JSON Schema 是一種用于描述 JSON 數據結構的規范。它允許你定義 JSON 數據的格式、類型、約束條件等,從而確保 JSON 數據符合預期的結構。通過 JSON Schema,你可以在數據交換、存儲或處理之前,對 JSON 數據進行驗證,確保其有效性和一致性。

簡單來說,JSON Schema 就像是 JSON 數據的“藍圖”或“合同”,它規定了 JSON數據應該長什么樣子。

三、JSON Schema 的基本結構

一個 JSON Schema 本身也是一個 JSON 對象。它由一系列關鍵字(keywords)組成,這些關鍵字用于定義 JSON 數據的結構和約束條件。

3.1 基本關鍵字

  • $schema: 指定使用的 JSON Schema 版本。例如,"$schema": "http://json-schema.org/draft-07/schema#" 表示使用 Draft 7 版本的 JSON Schema。
  • $id: 為 Schema 定義一個唯一的標識符,通常是一個 URL。
  • titledescription: 分別為 Schema 提供標題和描述信息,便于理解和維護。
  • type: 定義 JSON 數據的類型。常見的類型有 object、array、string、number、integer、booleannull

3.2 對象屬性

  • properties: 定義對象中的各個屬性及其對應的 Schema。
  • required: 指定哪些屬性是必須的。
  • additionalProperties: 控制是否允許對象包含未在 properties 中定義的額外屬性。

3.3 數組元素

  • items: 定義數組中每個元素的 Schema。
  • minItemsmaxItems: 分別指定數組的最小和最大長度。
  • uniqueItems: 指定數組中的元素是否必須唯一。

3.4 字符串約束

  • minLength 和 maxLength: 分別指定字符串的最小和最大長度。
  • pattern: 使用正則表達式約束字符串的格式。
  • format: 指定字符串的格式,如 email、date-time 等。

3.5 數值約束

  • minimum 和 maximum: 分別指定數值的最小和最大值。
  • exclusiveMinimumexclusiveMaximum: 指定數值是否排除最小值和最大值。
  • multipleOf: 指定數值必須是某個數的倍數。

四、示例:定義一個簡單的 JSON Schema

假設我們要定義一個表示用戶信息的 JSON 數據結構,要求如下:

  • 用戶對象必須包含 idnameemail 屬性。
  • id 必須是整數。
  • name 必須是字符串,且長度在 1 到 50 之間。
  • email 必須是有效的電子郵件地址。
  • 用戶對象可以包含可選的 age 屬性,且必須是正整數。

對應的 JSON Schema 可以這樣定義:

{"$schema": "http://json-schema.org/draft-07/schema#","$id": "https://example.com/user.schema.json","title": "User","description": "A user object","type": "object","properties": {"id": {"type": "integer"},"name": {"type": "string","minLength": 1,"maxLength": 50},"email": {"type": "string","format": "email"},"age": {"type": "integer","minimum": 0,"exclusiveMinimum": true}},"required": ["id", "name", "email"],"additionalProperties": false
}

解釋

  • $schema$id 分別指定了 Schema 的版本和唯一標識符。
  • type 指定了 JSON 數據的類型為 object
  • properties 定義了對象的各個屬性及其約束條件。
  • required 指定了 idnameemail 是必須的屬性。
  • additionalProperties 設置為 false,表示不允許對象包含未定義的屬性。

五、使用 JSON Schema 進行驗證

定義好 JSON Schema 后,我們可以使用各種工具和庫來驗證 JSON 數據是否符合該 Schema。以下是一些常用的驗證工具:

  • JavaScript: 可以使用 Ajv 庫進行驗證。
  • Python: 可以使用 jsonschema 庫進行驗證。
  • 在線工具: 可以使用 JSON Schema Validator 在線驗證 JSON 數據。

示例:使用 Ajv 進行驗證
假設我們有以下 JSON 數據:

 
{"id": 1,"name": "John Doe","email": "john.doe@example.com","age": 30
}

我們可以使用 Ajv 來驗證該數據是否符合我們定義的 Schema


const Ajv = require('ajv');
const ajv = new Ajv();const schema = {"$schema": "http://json-schema.org/draft-07/schema#","$id": "https://example.com/user.schema.json","title": "User","description": "A user object","type": "object","properties": {"id": {"type": "integer"},"name": {"type": "string","minLength": 1,"maxLength": 50},"email": {"type": "string","format": "email"},"age": {"type": "integer","minimum": 0,"exclusiveMinimum": true}},"required": ["id", "name", "email"],"additionalProperties": false
};const data = {"id": 1,"name": "John Doe","email": "john.doe@example.com","age": 30
};const validate = ajv.compile(schema);
const valid = validate(data);if (valid) {console.log('數據有效');
} else {console.log('數據無效:', validate.errors);
}

如果數據符合 Schema,輸出將是 數據有效;否則,輸出將是 數據無效 并顯示具體的錯誤信息。

六、實戰效果

我們以 Furion 框架為例,Furion 框架提供了完整的 FurionASP.NET CoreJSON Schema 文件,通過該文件可以在編寫配置文件時提供完整的智能提示和校驗。

6.1 如何使用

使用方式非常簡單,只需要在 .json 文件的頭部添加 "$schema":"https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json", 即可,
如:

{"$schema": "https://gitee.com/dotnetchina/Furion/raw/v4/schemas/v4/furion-schema.json","Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information","Microsoft.EntityFrameworkCore": "Information","Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"}},"AllowedHosts": "*"
}

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
怎么樣,這會知道好處了把!!

七、總結

JSON Schema 是一種強大的工具,可以幫助你定義和驗證 JSON 數據的結構。通過使用 JSON Schema,你可以確保 JSON 數據的有效性和一致性,減少數據錯誤和異常情況的發生。本文介紹了 JSON Schema 的基本概念、語法結構,并通過實例演示了如何定義和使用 JSON Schema

希望這篇入門指南能幫助你更好地理解和使用 JSON Schema。如果你有更多問題或需要進一步的幫助,歡迎在評論區留言討論!


參考資料:

  • JSON Schema 官方文檔
  • Ajv 文檔
  • JSON Schema Validator

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896618.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896618.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896618.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

前端Npm面試題及參考答案

目錄 npm 是什么?它的主要作用是什么? npm 包管理工具與 Yarn 有何不同? npm 的 package.json 文件有哪些重要字段? 什么是 npm 依賴?如何在項目中安裝、更新和移除依賴? npm 的 node_modules 目錄是什么?它的作用是什么? 什么是 npm 腳本?如何在 package.json 中…

零樣本思維鏈(Zero-shot CoT)

Large Language Models are Zero-Shot Reasoners (Kojima et al., 2022) 這篇文章研究了大型語言模型 (LLMs) 在推理任務上的能力,并提出了一種名為 Zero-shot-CoT 的新方法,該方法能夠有效地引導 LLM 進行多步驟推理,并在各種推理任務上取得…

day01_Java基礎

文章目錄 day01_Java基礎一、今日課程內容二、Java語言概述(了解)1、Java語言概述2、為什么要學習Java語言3、Java平臺版本說明4、Java特點 三、Java環境搭建(操作)1、JDK和JRE的概述2、JDK的下載和安裝3、IDEA的安裝4、IDEA的啟動…

設計模式 之 生產消費者模型 (C++)

文章目錄 設計模式 之 生產消費者模型 (C)引言生產消費者模型的基本概念為什么需要生產消費者模型應用場景:C 實現生產消費者模型代碼示例代碼詳細解釋共享資源和同步機制生產者函數 producer()消費者函數 consumer()主函數 main() 注意事項總…

Spring Boot 項目開發流程全解析

目錄 引言 一、開發環境準備 二、創建項目 三、項目結構 四、開發業務邏輯 1.創建實體類: 2.創建數據訪問層(DAO): 3.創建服務層(Service): 4.創建控制器層(Controller&…

數據結構課程設計(java實現)---九宮格游戲,也稱幻方

【問題描述】 九宮格,一款數字游戲,起源于河圖洛書,與洛書是中國古代流傳下來的兩幅神秘圖案,歷來被認為是河洛文化的濫觴,中華文明的源頭,被譽為"宇宙魔方"。九宮格游戲對人們的思維鍛煉有著極大…

GPT-4.5 怎么樣?如何升級使用ChatGPTPlus/Pro? GPT-4.5設計目標是成為一款非推理型模型的巔峰之作

GPT-4.5 怎么樣?如何升級使用ChatGPTPlus/Pro? GPT-4.5設計目標是成為一款非推理型模型的巔峰之作 今天我們來說說上午發布的GPT-4.5,接下來我們說說GPT4.5到底如何,有哪些功能?有哪些性能提升?怎么快速使用到GPT-4.…

【vscode-解決方案】vscode 無法登錄遠程服務器的兩種解決辦法

解決方案一: 查找原因 命令 ps ajx | grep vscode 可能會看到一下這堆信息(如果沒有大概率不是這個原因導致) 這堆信息的含義:當你使用 vscode 遠程登錄服務器時,我們遠程機器服務端要給你啟動一個叫做 vscode serv…

一、對4*3按鍵模塊編程分析

一、4*3鍵盤模塊實物分析 說明: 1、橫著4排,豎著3列,加起來共7組,所以對外引出7根線。 2、根據排針終端引腳又可分兩類。即橫排和豎列對應的引腳。 二、代碼編寫構想: 1、使用7個gpio輸入中斷,檢測7個…

自然語言處理NLP入門 -- 第十節NLP 實戰項目 2: 簡單的聊天機器人

一、為什么要做聊天機器人? 在互聯網時代,我們日常接觸到的“在線客服”“自動問答”等,大多是以聊天機器人的形式出現。它能幫我們快速回復常見問題,讓用戶獲得及時的幫助,并在一定程度上減少人工客服的壓力。 同時&…

linux(1)文件管理

文章目錄 文件目錄系統相對路徑絕對路徑命令解析器文件管理 文件目錄系統 bin: 二進制文件目錄,存儲可執行文件 dev:設備目錄,所有的硬件都會抽象成文件存儲,比如鼠標鍵盤 home:存儲普通用戶的家目錄 li…

CSS—選擇器詳解:5分鐘動手掌握選擇器

個人博客:haichenyi.com。感謝關注 1. 目錄 1–目錄2–引言3–種類4–優先級 引言 什么是選擇器? CSS選擇器是CSS(層疊樣式表)中的一種規則,用于指定要應用樣式的HTML元素。它們就像是指向網頁中特定元素的指針&#…

大模型微調入門(Transformers + Pytorch)

目標 輸入:你是誰? 輸出:我們預訓練的名字。 訓練 為了性能好下載小參數模型,普通機器都能運行。 下載模型 # 方式1:使用魔搭社區SDK 下載 # down_deepseek.py from modelscope import snapshot_download model_…

DeepSeek實戰

DeepSeek 接入實戰:從零開始快速上手 引言 在當今的 AI 領域,DeepSeek 作為一個強大的自然語言處理(NLP)平臺,提供了豐富的 API 接口,幫助開發者快速實現智能對話、文本生成、語義分析等功能。本文將帶你…

Android NDK打包封裝教程與優化技巧

關于NDK打包封裝的問題。首先,用戶可能不太清楚NDK的基本概念,所以我應該先解釋NDK是什么以及它的作用。然后,用戶可能想知道如何在Android項目中使用NDK,所以需要分步驟說明配置過程,包括安裝NDK、配置CMake或ndk-build,創建JNI接口,編寫C/C++代碼,編譯和打包。 接下…

【告別雙日期面板!一招實現el-date-picker智能聯動日期選擇】

告別雙日期面板!一招實現el-date-picker智能聯動日期選擇 1.需求背景2.DateTimePicker 現狀圖3.日期選擇器實現代碼4.日期選擇器實現效果圖5.日期時間選擇器實現代碼6.日期時間選擇器實現效果圖 1.需求背景 在用戶使用時間查詢時,我們經常需要按月份篩選…

Linux(ftrace)__mcount的實現原理

Linux 內核調試工具ftrace 之(_mcount的實現原理) ftrace 是 Linux 內核中的一種跟蹤工具,主要用于性能分析、調試和內核代碼的執行跟蹤。它通過在內核代碼的關鍵點插入探針(probe)來記錄函數調用和執行信息。這對于開…

Java注解(Annotation)

一、注解的定義 核心概念 注解是Java中一種特殊形式的“元數據”,用于為類、方法、字段、參數等代碼元素附加說明信息。它不會直接影響代碼邏輯,但可以通過編譯器、框架或反射機制進行解析和處理。 與注釋(Comment)的區別 注釋&a…

tauri2+typescript+vue+vite+leaflet等的簡單聯合使用(一)

項目目標 主要的目的是學習tauri。 流程 1、搭建項目 2、簡單的在項目使用leaflet 3、打包 準備項目 環境準備 廢話不多說,直接開始 需要有準備能運行Rust的環境和Node,對于Rust可以參考下面這位大佬的文章,Node不必細說。 Rust 和…

深入解析 Svelte:下一代前端框架的革命

深入解析 Svelte:下一代前端框架的革命 1. Svelte 簡介 Svelte 是一款前端框架,與 React、Vue 等傳統框架不同,它采用 編譯時(Compile-time) 方式來優化前端應用。它不像 React 或 Vue 依賴虛擬 DOM,而是…