---
title: 利用 JSON Schema 校验 JSON 数据
description: 在如今高速发展的世界中，能够快速有效地交付高质量的软件产品变得至关重要。持续交付作为一种软件开发实践，能够帮助团队实现这一目标。通过持续交付，我们可以构建、测试并发布软件，以更频繁、更可靠的方式满足用户需求。
image: https://blog.advance.ai/hubfs/shutterstock_1890188701%20(1).jpg
---

[![wordmark-green-01-1](https://blog.advance.ai/hs-fs/hubfs/wordmark-green-01-1.png?width=446&height=54&name=wordmark-green-01-1.png "wordmark-green-01-1")](https://www.advanceai.com.cn/)

- 核心产品 
    - - AI 生物识别验证 
                  - [活体检测](https://www.advanceai.com.cn/liveness-detection)
                  - [人脸图像比对](https://www.advanceai.com.cn/face-comparison)
                  - [人脸搜索](https://www.advanceai.com.cn/face-search)
                  - [多维依据凭证人脸信用评分](https://www.advanceai.com.cn/facial-multi-loan-score)
          - AI 文档验证 
                  - [证件识别](https://www.advanceai.com.cn/id-document-recognition)
- 解决方案 
    - [数字身份验证](https://www.advanceai.com.cn/digital-identity-verification)
    - [视频身份验证](https://www.advanceai.com.cn/video-identification)
    - [更多部署方案](https://www.advanceai.com.cn/deployment-options)
- 行业应用 
    - [金融服务](https://www.advanceai.com.cn/financial-services)
    - [银行业](https://www.advanceai.com.cn/banking)
    - [旅游出行](https://www.advanceai.com.cn/travel)
    - [共享经济](https://www.advanceai.com.cn/sharing-economy)
    - [电子商务](https://www.advanceai.com.cn/e-commerce)
    - [金融科技](https://www.advanceai.com.cn/fintech)
- ADVANCE.AI研究 
    - [市场活动](https://www.advanceai.com.cn/events)
    - [白皮书和报告](https://www.advanceai.com.cn/whitepaper-reports_1)
    - [博客中心](https://www.advanceai.com.cn/blog)
- 关于我们 
    - [公司简介](https://www.advanceai.com.cn/about-advance-ai)
    - [安全团队](https://www.advanceai.com.cn/security-team)
    - [合作伙伴](https://www.advanceai.com.cn/partnership)
    - [新闻动态](https://www.advanceai.com.cn/company-news)
    - [加入我们](https://www.advanceai.com.cn/join-us)

- 核心产品 
    - 人工智能面部识别 
          - [活体检测](https://www.advance.ai/cn/liveness-detection)
          - [人脸图像比对](https://www.advance.ai/cn/face-comparison)
          - [人脸搜索](https://www.advance.ai/cn/face-search)
          - [欺诈人脸](https://www.advance.ai/cn/fraud-face)
          - [多维数据人脸信用评分](https://www.advance.ai/cn/facial-multi-loan-score)
    - 人工智能文件识别 
          - [证件识别](https://www.advance.ai/cn/id-document-recognition)
          - [身份证打码工具](https://www.advance.ai/cn/id-card-masking)
          - [证件打码](http://demo2019.test.yongsy.net/zhixinyin/index.html)
    - 人工智能文件处理 
          - [收据识别](https://www.advance.ai/cn/receipt-recognition)
          - [银行流水账单分析工具](https://www.advance.ai/cn/bank-statement-analyser)
    - 智慧零售货架识别 
          - [智慧零售](https://www.advance.ai/cn/smart-retailing)
- 解决方案 
    - [数字身份验证](https://www.advance.ai/cn/digital-identity-verification)
    - [视频身份验证](https://www.advance.ai/cn/video-identification)
    - [联合建模](https://www.advance.ai/cn/joint-modelling)
    - [更多部署方案](https://www.advance.ai/cn/deployment-options)
- 行业应用 
    - [金融服务](https://www.advance.ai/cn/financial-services)
    - [银行业](https://www.advance.ai/cn/banking)
    - [数字支付](https://www.advance.ai/cn/payment)
    - [医疗保健](https://www.advance.ai/cn/healthcare)
    - [旅游出行](https://www.advance.ai/cn/travel)
    - [共享经济](https://www.advance.ai/cn/sharing-economy)
    - [电子商务](https://www.advance.ai/cn/e-commerce)
    - [金融科技](https://www.advance.ai/cn/fintech)
    - [智慧物联](https://www.advance.ai/cn/internet-of-things)
- 领创研究 
    - [分享会](https://www.advance.ai/cn/events)
- 关于我们 
    - [公司简介](https://www.advance.ai/cn/about-advance-ai)
    - [安全团队](https://www.advance.ai/cn/security-team)
    - [新闻动态](https://www.advance.ai/cn/company-news)
    - [加入我们](https://www.advance.ai/cn/join-us)
    - [联系我们](https://www.advance.ai/cn/contact-us)

免费试用

中

- [EN](https://advance.ai/)

![](https://blog.advance.ai/hubfs/shutterstock_1890188701%20(1).jpg)

# 利用 JSON Schema 校验 JSON 数据

 Published by [Sample HubSpot User](https://blog.advance.ai/zh-cn/author/sample-hubspot-user) on  Oct 18, 2023, 2:44:10 PM

**作者：马铁强  职位：QA Lead**

##### **背景介绍**

首先介绍一下JSON Schema ，它是用于验证 JSON 数据结构的强大工具，JSON Schema是以一个JSON串来描述的JSON数据规范，可以用JSON Schema检验一个给定的JSON串是否满足约定的数据规范。目前工作中的http接口的输入输出多数都是JSON格式的数据，校验数据格式是否满足约定是必不可少的，无论是业务代码中对输入数据进行校验，还是测试用例中对接口输出数据做校验，都可以通过JSON Schema完成。下面通过几个例子看看JSON Schema到底是个啥。

 

## **1、例子1：最简单的JSON Schema就是没有限制**

虽然我们使用JSON Schema 的目的是对JSON格式的数据做种种限制和校验，但空对象是完全有效的模式，可以接受任何有效的JSON。

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-21-39-0419-AM.png)  
下面这些都是有效的数据

```

```

 

## **2、例子2：JSON Schema的限制条件**

为JSON Schema加几个限制条件，看看下面这个JSON Schema是如何约定JSON数据的

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-22-54-5488-AM.png)

- type关键字表示JSON 限定类型是object，每个属性的type表示这个属性的数据类型
- properties关键字指定这个object有三个属性number,street\_name,street\_type,
- enum关键字表示这个street\_type的数据只能是"Street", "Avenue", "Boulevard"这三个值
- required 表示number,street\_name是必须有的属性，默认情况下，由properties关键字定义的属性不是必需的。

**2.1** **可以校验通过的数据**

**![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-24-08-3430-AM.png)**

**2.****2 不能校验通过的数据**

缺少必须属性

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-25-03-4812-AM.png)

street\_type使用的值“super-speed”不是在JSON Schema中约定的枚举值

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-25-31-7548-AM.png)

## **3、关键字介绍**

JSON Schema通过关键字描述对JSON数据的限制条件，下面再介绍几个关键字进一步了解JSON Schema 的功能。

**3.1** **用来定义基本功能的关键字**

$schema: 这个关键字是JSON Schema的方言标识符，用于声明schema使用的是哪个draft版本。

{ "$schema": "http://json-schema.org/draft-07/schema#" }

 

$id: 声明一个模式资源标识

{ "$id":"http://yourdomain.com/schemas/youschema.json"}

 

type: 声明数据类型，可选的内容包括：

 

**3.2 用于string类型验证的关键字**

可以用下面这些关键字去限制string类型的数据

- minLength，字符串最小长度，非负数
- maxLength，字符串最大长度，非负数
- pattern，正则表达式

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-28-35-6561-AM.png)

**3.3** **用于Number类型验证的关键字**

- maximum: 限定最大值小于等于给定的值
- minimum: 限定最小值大于等于给定的值
- exclusiveMaximum: 限定最大值小于给定的值
- exclusiveMinimum: 限定最小值大于给定的值
- multipleOf: 限制数据为给定数字的倍数。

下面例子约定值是10的倍数都可以校验通过。

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-29-06-9467-AM.png)

**3.4 用于Array类型验证的关键字**

数组类型的限制分为两种：items模式和contains模式  
items模式：任意长度的序列，其中每个项目都匹配相同的模式。

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-29-36-7063-AM.png)

- minItems: 限定数组长度大于等于给定的值
- maxItems: 限定数组长度小于等于给定的值
- uniqueItems: 限定数组中元素是唯一的

 

contains模式只需要针对数组中的一个或多个项目进行验证。

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-29-59-1545-AM.png)

- minContains: 限定最少匹配contains的次数
- maxContains: 限定最多匹配contains的次数

 

验证失败的数据

\["apple", "orange", 2\]  
\["apple", "orange", 2, 4, 8, 16\]

验证通过的数据

\["apple", "orange", 2, 4\]  
\["apple", "orange", 2, 4, 8\]number还可以使用multipleOf关键字将数字限制为给定数字的倍数。它可以被设置为任何正数。

**3.5 用于Object类型验证的关键字**

**![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-30-51-5169-AM.png)**

- minProperties: 限定最小属性个数
- maxProperties: 限定最大属性个数
- required: 必须有得属性
- properties: 用来配置对象属性

 

## **4、Java中利用JSON Schema校验数据**

下面我们用一个简单的例子演示一下JSON Schema在java程序中校验数据

**4.1 首先配置依赖**

1. jsonschema-generator是一个根据java object生成JSON Schema的工具，支持Draft 6, 7, 2019-09， 2020-12
2. everit-json-schema是官方推荐的一个校验工具

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-32-12-4356-AM.png)

**4.2 再准备一个JSON Schema**

约定输入的JSON数据的目的实际是要用这个数据转化成java对象，所以我们用一个java对象生成一个JSON Schema

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-32-50-4633-AM.png)

这样我们就获得了一个JSON Schema

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-34-18-4886-AM.png)

接下来我们准备一个用于验证的JSON数据，这是一个不符合JSON Schema约定的数据

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-34-45-1985-AM.png)

校验数据

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-41-15-5667-AM.png)

执行结果中包含了输入数据包含的6个不符合约定的地方

![](https://blog.advance.ai/hubfs/image-png-Oct-18-2023-06-41-29-8208-AM.png)

**5、结语**

JSON Schema提供了数据规范语法，JSON Schema 标准经过修订有多个Draft，当前的版本是Draft 202-12,Draft版本不同会略有差异。JSON Schema可以用于校验接口输入数据、自动化测试、甚至可以用其生成代码，jsonschema2pojo就是一个这样的工具，利用JSON Schema在数据约束和校验方面可以提供一些便利。

 

***参考***

*Understanding JSON Schema — Understanding JSON Schema 2020-12 documentation https://json-schema.org/understanding-json-schema/ *

 

 

[Back to Blog](https://blog.advance.ai/zh-cn)

## Related Articles

<https://blog.advance.ai/zh-cn/how-software-is-developed-and-delivered>

## [持续交付：改变软件开发和交付的方式](https://blog.advance.ai/zh-cn/how-software-is-developed-and-delivered)

 作者：杨岳彤 职位：架构师

[Read More](https://blog.advance.ai/zh-cn/how-software-is-developed-and-delivered)

<https://blog.advance.ai/zh-cn/spring-gateway-route>

## [如何实现Spring Gateway路由的动态加载和刷新？](https://blog.advance.ai/zh-cn/spring-gateway-route)

 作者：陆永剑 职位：后端工程师

[Read More](https://blog.advance.ai/zh-cn/spring-gateway-route)

<https://blog.advance.ai/zh-cn/springcloud-architecture-breakpoint-debugging>

## [k8s集群中的springcloud架构如何丝滑的断点调试](https://blog.advance.ai/zh-cn/springcloud-architecture-breakpoint-debugging)

 作者：马铁强 职位：QA Lead

[Read More](https://blog.advance.ai/zh-cn/springcloud-architecture-breakpoint-debugging)

[![wordmark-white-01](https://blog.advance.ai/hs-fs/hubfs/AAI%20logo/wordmark-white-01.png?width=3809&name=wordmark-white-01.png "wordmark-white-01")](http://demo2019.test.yongsy.net/zhixincn/index.html)

- 友情链接 
    - [领创集团](https://www.advancegroup.com.cn/)
- 核心产品 
    - [AI 生物识别验证](https://www.advanceai.com.cn/liveness-detection)
    - [AI 文档验证](https://www.advanceai.com.cn/id-document-recognition)
- 解决方案 
    - [星鉴解决方案](https://www.advanceai.com.cn/xingjian)
    - [视频身份验证](https://www.advanceai.com.cn/video-identification)
    - [更多部署方案](https://www.advanceai.com.cn/deployment-options)
- 行业应用 
    - [金融服务](https://www.advanceai.com.cn/financial-services)
    - [银行业](https://www.advanceai.com.cn/banking)
    - [旅游出行](https://www.advanceai.com.cn/travel)
    - [共享经济](https://www.advanceai.com.cn/sharing-economy)
    - [电子商务](https://www.advanceai.com.cn/e-commerce)
    - [金融科技](https://www.advanceai.com.cn/fintech)
- 关于我们 
    - [公司简介](https://www.advanceai.com.cn/about-advance-ai)
    - [安全团队](https://www.advanceai.com.cn/security-team)
    - [合作伙伴](https://www.advanceai.com.cn/partnership)
    - [新闻动态](https://www.advanceai.com.cn/company-news)
    - [加入我们](https://www.advanceai.com.cn/join-us)

© 2024 ADVANCE.AI. 请参阅领创智信的[服务条款](https://beta.advance.ai/terms-of-service)和[隐私和安全声明](https://beta.advance.ai/privacy-security-statement)

[![Contact Icon](https://blog.advance.ai/hs-fs/hubfs/raw_assets/public/AdvanceIntelligence_October2020/images/icon1.png?width=180&name=icon1.png "Contact Icon")](https://info.advance.ai/cn-free-trial)

[![Message Icon](https://blog.advance.ai/hs-fs/hubfs/raw_assets/public/AdvanceIntelligence_October2020/images/icon2.png?width=180&name=icon2.png "Message Icon")](https://info.advance.ai/zh-cn/advance.ai-lianxiwomen)

![Back To Top](https://blog.advance.ai/hubfs/raw_assets/public/AdvanceIntelligence_October2020/images/icon4.png)