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

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

# [利用 JSON Schema 校验 JSON 数据](https://blog.advance.ai/zh-cn/use-json-schema-verify-json-data)

 作者：[Sample HubSpot User](https://blog.advance.ai/zh-cn/author/sample-hubspot-user) | Oct 18, 2023, 6:44:10 AM

**作者：马铁强  职位：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。

下面这些都是有效的数据

```

```

 

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

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

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

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

**2.2 不能校验通过的数据**

缺少必须属性

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

## **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，正则表达式

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

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

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

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

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

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

 

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

- 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类型验证的关键字**

- 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是官方推荐的一个校验工具

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

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

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

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

校验数据

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

**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/* 

 

 

[查看完整帖子](https://blog.advance.ai/zh-cn/use-json-schema-verify-json-data)

```json
{
  "@context" : "http://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Sample HubSpot User"
  },
  "dateModified" : "2023-11-16T07:24:19.289Z",
  "datePublished" : "2023-10-18T06:44:10Z",
  "headline" : "利用 JSON Schema 校验 JSON 数据",
  "image" : {
    "@type" : "ImageObject",
    "height" : 4024,
    "url" : "https://5877117.fs1.hubspotusercontent-na1.net/hubfs/5877117/shutterstock_1890188701%20%281%29.jpg",
    "width" : 6048
  },
  "mainEntityOfPage" : "https://blog.advance.ai/zh-cn/use-json-schema-verify-json-data",
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "height" : 60,
      "url" : "/hs/hsstatic/content_shared_assets/static-1.4092/img/default-amp-logo.png",
      "width" : 60
    },
    "name" : "Chinese Blog"
  }
}
```