如何添加数组格式的JSON验证规则_通过结构配置强制验证复杂数据类型的格式

千晨同学_7778

千晨同学_7778

2026-05-23

610人浏览

原创

json schema 中数组验证必须配置 items 字段,仅 type: "array" 无法约束元素类型;items 可设固定类型、anyof 联合类型,并配合 minitems/maxitems 控制长度;ajv 需启用 stricttypes 并显式声明 nullable;yaml 转换时须确保 items 正确缩进;嵌套数组需逐层独立定义 items,推荐用 $ref 复用。

json schema 里怎么写数组格式的验证规则

数组不是加个 type: "array" 就完事了,必须配 items 才能真正约束内容格式。否则校验器只认“是数组”,不管里面是字符串、对象还是混着来的。

常见错误现象:["a", 123, {"id": 4}] 过了验证,但业务上只允许全是字符串——这就是漏掉 items 导致的。

  • items 是必填项,只要你想验证数组元素的内容类型
  • 如果数组元素类型固定(比如全是对象),直接写 items: { "type": "object", "properties": { ... } }
  • 如果元素类型不统一(如字符串或数字二选一),用 items: { "anyOf": [{ "type": "string" }, { "type": "number" }] }
  • 想限制数组长度?补上 minItems 和 maxItems,别指望 items 自带长度控制

用 Ajv 验证含数组的 JSON 时为什么总跳过校验

Ajv 默认不开启 strictTypes,遇到字段缺失或类型松散就静默放过。数组里混进 null 或 undefined,没显式配 "nullable": true 就可能被忽略。

使用场景:后端接收前端传来的标签列表 tags: ["a", "b"],但前端偶尔发 tags: ["a", null],Ajv 却没报错。

  • 初始化 Ajv 实例时加上 { strictTypes: true },强制类型匹配
  • 数组元素若允许 null,在 items 里明确写 "type": ["string", "null"],别依赖默认行为
  • 检查是否误用了 additionalProperties: false 在父级对象上——它不影响数组内部校验,但容易让人误以为“全关严了”
  • 调试时加 console.log(ajv.errorsText()),别只看 validate() 返回布尔值

YAML 配置转 JSON Schema 后数组规则失效了

很多结构化配置工具(比如 Swagger / OpenAPI)用 YAML 描述 schema,但 YAML 的缩进和破折号(-)容易让 items 层级错位,生成的 JSON Schema 里 items 可能挂在错的对象上,甚至整个字段消失。

典型错误配置:

dmap-jsapi-skill
dmap-jsapi-skill

DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。

下载
tags:
  type: array
  - type: string  # ❌ 这行缩进错,YAML 解析器会把它当数组元素,不是 items 定义

正确写法:

tags:
  type: array
  items:  # ✅ 必须顶格对齐到 type 下,且用 items 字段名
    type: string
  • 所有 items 必须作为 key 出现,不能靠缩进模拟数组字面量
  • 用 yq 或在线 YAML-to-JSON 工具实时验证生成结果,重点看 items 是否出现在最终 JSON 的对应位置
  • 如果用 OpenAPI 3.0,schema.items 是强制字段,缺了会导致 spec 校验失败,而不仅是运行时无效

嵌套数组(如数组里套对象再套数组)怎么一层层写验证

嵌套越深,items 嵌套也越深,但每层都必须独立定义 items,不能“继承”外层类型。最容易被忽略的是中间对象里的数组字段没配 items,导致只校验了对象结构,放过了其内部数组的脏数据。

示例场景:用户提交订单,其中 items 是商品列表,每个商品有 options 数组,每个 option 是 {"name": "颜色", "value": "红"}。

  • 外层数组(items)的 items 是商品对象 schema
  • 商品对象里 options 字段还得单独配 "type": "array" + "items",不能省
  • 避免重复定义:把深层 schema 抽成 $ref,比如 "options": { "$ref": "#/components/schemas/OptionList" }
  • 性能影响:每多一层 items 嵌套,Ajv 构建 validator 时编译时间略增,但运行时开销几乎不变;真正拖慢的是深层循环校验 + 大量 if 分支,不是嵌套本身

复杂点从来不在“能不能写出来”,而在“改一处,漏三处”。数组的 items 没配全,等于给验证开了后门,而且这后门还藏在层层缩进和引用里,不容易一眼揪出来。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2095

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

3162

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

1056

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

3599

7

Python uv使用教程
Python uv使用教程

本专题汇总了 Python uv 使用教程与高效使用指南,从 uv 安装配置、常用命令到虚拟环境、依赖管理与项目打包,系统讲解如何用 uv 替代 pip 与 poetry,全面提升 Python 项目开发效率,助你快速上手这一现代化包管理工具,打造干净高效的 Python 工作流。

2026.10.15

0

15

剧云AI短剧创作教程合集
剧云AI短剧创作教程合集

本专题聚焦剧云AI短剧创作,讲解从短剧灵感、梗概、全局大纲到分集、分场和正文的完整流程及节奏设计方法。

2026.10.14

0

15

剧云AI剧本创作零基础入门
剧云AI剧本创作零基础入门

本专题系统讲解剧云AI剧本创作流程,涵盖灵感、梗概、大纲、分场与正文生成,帮助新手快速完成首个中文剧本项目。

2026.10.14

0

14

VibeKnow文档转视频操作指南
VibeKnow文档转视频操作指南

本专题讲解VibeKnow上传Word、TXT、Markdown等材料生成视频的方法,覆盖内容解析、脚本组织、画面生成与成片检查。

2026.10.14

0

15

VibeKnow知识视频制作与导出详解
VibeKnow知识视频制作与导出详解

本专题整理VibeKnow从注册、素材上传、AI生成到预览导出的完整操作,帮助新手快速制作第一条知识讲解视频。

2026.10.14

0

13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习