当前位置: 首页 > news >正文

JSON Schema 2020-12 介绍

一、概述

JSON Schema 是一种用于描述和验证 JSON 数据结构的规范,它提供了一种声明性的方法来定义 JSON 数据的格式、内容和约束条件。通过 JSON Schema,可以确保 JSON 数据符合预期的结构,满足特定的要求,从而提高数据交换的可靠性和一致性。

JSON Schema 2020-12 是 JSON Schema 规范的一个版本,于 2020 年 12 月发布。它是继 2019-09 版本之后的一个更新,包含了一些新的特性和改进,以增强模式定义的能力和灵活性。


二、历史背景
  1. 初始发布(2010 年)

    • JSON Schema 的早期版本是在 2010 年左右发布的,其目的是为 JSON 数据提供一个类似于 XML Schema 的模式定义方法。
  2. 草案版本

    • JSON Schema 规范以 IETF 草案的形式发布,版本号通常以年份和月份标识,例如 draft-07(2017 年 7 月)。
  3. 重要版本

    • draft-04(2013 年):广泛采用的版本,许多工具和库都支持该版本。
    • draft-06 和 draft-07(2017 年):引入了对正则表达式、if/then/else 等的支持。
    • 2019-09(draft-08):开始使用年份和月份作为版本号,引入了 $defs、动态引用等新特性。
    • 2020-12:本次介绍的版本,进一步完善了规范。

三、与 OpenAPI 的关系
  • OpenAPI 3.x

    • OpenAPI 使用 JSON Schema(遵循 draft-05 及更高版本)来定义 API 的请求和响应数据模型。
    • 通过在 OpenAPI 中集成 JSON Schema,可以精确地描述接口的数据结构,方便客户端和服务器的开发。
  • 兼容性

    • OpenAPI 3.1 开始,完全支持 JSON Schema 2020-12 规范,这意味着可以在 OpenAPI 中使用最新的 JSON Schema 特性。

四、核心概念
  1. 模式(Schema)

    • 描述 JSON 数据结构的蓝图,定义了数据的类型、格式、必需属性等。
  2. 关键词(Keywords)

    • JSON Schema 使用特定的关键词来描述约束条件,如 typepropertiesitemsrequired 等。
  3. 验证(Validation)

    • 通过将 JSON 数据与模式进行比较,验证数据是否符合模式所定义的约束。
  4. 引用(Ref)

    • 使用 $ref 关键词,可以在模式中引用其他模式,实现模式的复用和模块化。

五、JSON Schema 的基础结构
  1. $schema

    • 指定所遵循的 JSON Schema 版本的 URI。
    • 示例:"$schema": "https://json-schema.org/draft/2020-12/schema"
  2. 基本类型验证

    • type:指定数据的类型,如 objectarraystringnumberbooleannull
  3. 对象类型的关键词

    • properties:定义对象的属性及其子模式。
    • required:指定对象中必需的属性名称数组。
    • additionalProperties:控制对象中未在 properties 中定义的额外属性。
    • patternProperties:使用正则表达式匹配属性名称,应用相应的子模式。
  4. 数组类型的关键词

    • items:定义数组元素的模式,可以是单一模式或模式数组。
    • additionalItems:当 items 是一个模式数组时,控制额外元素。
    • minItemsmaxItems:指定数组元素的最小和最大数量。
    • uniqueItems:布尔值,指定数组元素是否必须唯一。
  5. 字符串类型的关键词

    • minLengthmaxLength:字符串的最小和最大长度。
    • pattern:用于匹配字符串的正则表达式。
  6. 数值类型的关键词

    • minimummaximum:指定数值的最小和最大值。
    • exclusiveMinimumexclusiveMaximum:严格小于或大于指定的值。
    • multipleOf:指定数值必须是某个值的倍数。
  7. 通用关键词

    • enum:指定可以接受的固定值列表。
    • const:指定一个固定的常量值。
    • $ref:引用其他模式的 URI。

六、动态引用(Dynamic References)

动态引用是 2020-12 版本引入的重要特性,主要通过 $dynamicRef$dynamicAnchor 实现。

  1. $dynamicAnchor

    • 用于定义动态锚点,在模式中标记一个位置,供动态引用使用。

    • 示例:

      {"$dynamicAnchor": "node","type": "object","properties": {"child": { "$dynamicRef": "#node" }}
      }
      
  2. $dynamicRef

    • 类似于 $ref,但在引用解析时,会动态地向上查找具有匹配 $dynamicAnchor 的模式。
    • 解决了在递归模式或组合模式中,无法使用相对引用的问题。

七、内容关键字的增强
  1. contentEncoding

    • 指定字符串的编码方式,如 base64quoted-printable

    • 示例:

      {"type": "string","contentEncoding": "base64"
      }
      
  2. contentMediaType

    • 指定字符串内容的媒体类型(MIME type),如 application/jsontext/html

    • 示例:

      {"type": "string","contentMediaType": "image/png","contentEncoding": "base64"
      }
      
  3. contentSchema

    • 指定嵌入内容的模式定义,多用于字符串中包含嵌套的 JSON 数据时。

    • 示例:

      {"type": "string","contentMediaType": "application/json","contentSchema": {"type": "object","properties": {"name": { "type": "string" },"age": { "type": "integer", "minimum": 0 }}}
      }
      

八、示例

示例:定义用户信息的 JSON Schema

{"$schema": "https://json-schema.org/draft/2020-12/schema","$id": "https://example.com/user.schema.json","title": "用户信息","description": "描述用户信息的模式","type": "object","properties": {"id": {"description": "用户唯一标识符","type": "string"},"name": {"description": "用户姓名","type": "string","minLength": 1},"email": {"description": "用户邮箱","type": "string","format": "email"},"age": {"description": "用户年龄","type": "integer","minimum": 0},"profileImage": {"description": "Base64 编码的用户头像","type": "string","contentEncoding": "base64","contentMediaType": "image/png"},"address": {"$ref": "https://example.com/address.schema.json"}},"required": ["id", "name", "email"]
}
  • 解释

    • 使用 $schema 指定了模式所遵循的版本,即 2020-12。
    • properties 中定义了用户的各个属性。
    • 使用了 contentEncodingcontentMediaType 来描述 profileImage 的编码和媒体类型。
    • 通过 $ref 引用了外部的地址模式,实现模式的复用和模块化。

九、应用场景
  1. 数据验证

    • 在数据传输和存储过程中,使用 JSON Schema 验证数据的完整性和正确性。
  2. API 参数和响应验证

    • 定义 API 接口的请求参数和响应结构,确保客户端和服务器之间的数据格式一致。
  3. 配置文件验证

    • 验证系统或应用程序的配置文件是否符合预期的格式和内容要求。
  4. 文档生成

    • 根据 JSON Schema 自动生成数据格式的文档,提供给开发者或使用者参考。
  5. 代码生成

    • 根据模式生成数据模型的代码,实现对数据的读取、写入和操作。

十、工具和生态系统
  1. JSON Schema 验证库

    • AJV:高性能 JSON Schema 验证器,支持最新的规范版本。

      链接:https://ajv.js.org/

    • jsonschema:用于 Python 的 JSON Schema 验证库。

      链接:https://github.com/Julian/jsonschema

  2. 编辑器和 IDE 支持

    • VSCode:通过插件支持 JSON Schema 的语法高亮、自动补全和验证。

    • JSON Schema Store:提供大量的公共 JSON Schema,自动与编辑器集成。

      链接:https://www.schemastore.org/

  3. 在线工具

    • JSON Schema 在线验证器:提供在线的模式编写和数据验证功能。

      链接:https://www.jsonschemavalidator.net/

  4. 文档生成工具

    • DocGen:根据 JSON Schema 生成人类可读的文档。
  5. 代码生成工具

    • quicktype:从 JSON Schema 生成多种语言的数据模型代码。

      链接:https://quicktype.io/


十二、最佳实践
  1. 模式的组织和模块化

    • 使用 $ref 引用,将大型模式拆分为多个可复用的子模式,提高可维护性。
  2. 使用 $id$anchor

    • 为模式和子模式定义唯一的标识符,方便引用和管理。
  3. 明确的描述和注释

    • 使用 titledescription 等关键词,为模式和属性添加说明,提升可读性。
  4. 合理使用关键词

    • 根据数据类型和需求,选择合适的验证关键词,避免过度或不足的约束。
  5. 持续更新模式

    • 随着业务需求的变化,及时更新 JSON Schema,确保与实际数据一致。

十三、迁移和兼容性
  • 从旧版本迁移到 2020-12

    • 了解新版本中引入的特性和修改,对模式进行相应的调整。
    • 注意一些关键词的行为可能有所改变,需要重新验证模式。
  • 版本兼容性

    • 验证器和工具可能对不同版本的 JSON Schema 支持不一致,确保所使用的工具支持 2020-12 版本。

十四、总结

JSON Schema 2020-12 版本在之前版本的基础上,进一步增强了模式的表达能力和灵活性。通过引入动态引用、内容关键字增强等特性,开发者可以定义更复杂、更准确的数据结构和约束。

JSON Schema 在数据验证、API 开发、配置管理等领域有广泛的应用,是保障数据质量和一致性的强大工具。熟练掌握 JSON Schema 的使用,能够提高系统的可靠性,减少因数据格式不符而导致的错误。


十五、参考资源
  • JSON Schema 官方网站:https://json-schema.org/
  • JSON Schema 规范文档(2020-12):https://json-schema.org/draft/2020-12/schema
  • JSON Schema GitHub:https://github.com/json-schema-org/
  • AJV JSON Schema Validator:https://ajv.js.org/
  • JSON Schema Validator Online:https://www.jsonschemavalidator.net/
  • JSON Schema Store:https://www.schemastore.org/

相关文章:

  • Web前端基础之HTML
  • C++ call_once用法
  • 第四章无线通信网
  • QDialog的show()方法与exec_()方法的区别详解
  • BUUCTF两道目录包含题目
  • Go 协程(Goroutine)入门与基础使用
  • Maven 之 打包项目时没有使用本地仓库依赖问题
  • JAVA(Day_4
  • 使用 Pandas 进行数据聚合与操作:从合并到可视化的全面指南
  • 25/6/11 <算法笔记>RL基础算法讲解
  • 入门Scikit-learn:让机器学习像呼吸一样自然!
  • IDE(集成开发环境),集成阿里云的通义大模型
  • 2024 CKS题库+详尽解析| 1. kube-bench 修复不安全项
  • ElasticSearch配置详解:什么是重平衡
  • Pytorch 的编程技巧
  • PyTorch:让深度学习像搭积木一样简单有趣!
  • 通过Docker和内网穿透技术在Linux上搭建远程Logseq笔记系统
  • GlusterFS 分布式文件系统深度解析
  • Linux操作系统故障排查案例实战
  • 大数据服务器和普通服务器之间的区别
  • 大凤号 网站建设/网站推广优化排名教程
  • 网站网站建设专业/网站平台做推广
  • 装饰公司网站建设/厦门seo代理商
  • jsp动态网站开发与实例pdf/百度门店推广
  • 网站开发网站设计素材/大数据营销名词解释
  • 网站开发用什么编程/最近发生的热点事件