0

0

JSON Schema 数据验证失败的常见原因与正确写法详解

心靈之曲

心靈之曲

发布时间:2026-03-03 09:56:12

|

951人浏览过

|

来源于php中文网

原创

JSON Schema 数据验证失败的常见原因与正确写法详解

本文解析为何使用 jsonschema 进行数据校验时看似“成功”实则未生效,指出原始 schema 结构错误(如缺失 properties、误用 str 类型)、并提供符合规范的修正方案及完整验证示例。

本文解析为何使用 jsonschema 进行数据校验时看似“成功”实则未生效,指出原始 schema 结构错误(如缺失 `properties`、误用 `str` 类型)、并提供符合规范的修正方案及完整验证示例。

在使用 jsonschema 库进行 JSON 数据结构校验时,一个常见却隐蔽的问题是:校验看似通过,实则根本未执行预期规则。这往往源于 Schema 定义不符合 JSON Schema 规范,导致验证器仅识别了顶层字段(如 required),而忽略了嵌套的类型约束(如 orderId 必须为字符串)。下面我们将从问题根源出发,逐步构建一个可工作的、符合标准的 Schema。

? 问题定位:原始 Schema 的两大关键错误

  1. properties 缺失
    JSON Schema 中,对象("type": "object")的所有子字段定义(如 retMsg、result)必须包裹在 "properties" 键下。原始 Schema 将 retMsg 和 result 直接平铺在根对象中,这在语法上是无效的——jsonschema 解析器会静默忽略这些非标准字段,仅处理显式支持的元关键字(如 type、required)。

  2. 类型名错误:"str" → "string"
    JSON Schema 标准定义的原始类型名为 "string"、"number"、"boolean"、"array"、"object"、"null",
    不存在 "str"**。使用 "str" 会导致该字段的 type 约束完全失效。

✅ 正确 Schema 结构(Draft-04 兼容)

以下是修复后的完整、可验证的 Schema:

from jsonschema import validate, ValidationError

schema = {
    "$schema": "https://json-schema.org/draft-04/schema#",
    "type": "object",
    "required": ["retMsg", "result"],
    "properties": {  # ← 关键!所有子字段必须在此定义
        "retMsg": {
            "type": "string",      # ← 使用标准类型名 "string"
            "const": "OK"
        },
        "result": {
            "type": "object",
            "required": ["orderId", "orderLinkId"],
            "properties": {  # ← 嵌套对象也需 properties
                "orderId": {"type": "string"},
                "orderLinkId": {"type": "string"}
            }
        }
    }
}

raw_data = {
    "retMsg": "OK",
    "result": {
        "orderId": [],  # ← 非法:[] 是 array,非 string
        "orderLinkId": "abcde"
    }
}

? 验证结果:错误精准抛出

执行校验后,jsonschema 将明确报错,指出 orderId 字段值 [] 不符合 "string" 类型要求:

Promethean AI
Promethean AI

艺术家与AI一起构建虚拟世界

下载
try:
    validate(instance=raw_data, schema=schema)
    print("✅ Validation passed.")
except ValidationError as e:
    print("❌ Validation failed:")
    print(f"  Message: {e.message}")
    print(f"  Schema path: {' -> '.join([str(p) for p in e.absolute_schema_path])}")
    print(f"  Instance path: {' -> '.join([str(p) for p in e.absolute_path])}")

输出:

❌ Validation failed:
  Message: [] is not of type 'string'
  Schema path: properties -> result -> properties -> orderId -> type
  Instance path: result -> orderId

⚠️ 注意事项与最佳实践

  • 始终启用 $schema 声明:明确指定 Draft 版本(如 draft-04、draft-07 或 draft-2020-12),避免解析器使用默认或不兼容版本。
  • 使用 jsonschema.validators.Draft7Validator 显式指定版本(推荐):
    from jsonschema import Draft7Validator
    validator = Draft7Validator(schema)
    errors = list(validator.iter_errors(raw_data))  # 获取全部错误
  • 验证前先检查 Schema 有效性:可借助 jsonschema.validators.validator_for(schema).check_schema(schema) 提前发现语法错误。
  • 避免“假阳性”调试:若校验无报错但逻辑异常,优先检查 properties 是否遗漏、type 是否拼写正确、required 是否与 properties 对齐。

✅ 总结

JSON Schema 的强约束力依赖于严格遵循规范的结构定义。将字段直接写在 object 根层级(而非 properties 内)、误用非标准类型名(如 "str"),都会导致验证逻辑被跳过,造成“校验成功”的假象。修正的核心只有两点:补全 properties 层级 + 使用标准类型关键字。掌握这一原则,即可确保数据契约真正落地,为 API 响应、配置文件、ETL 流程等场景提供可靠保障。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

452

2023.08.07

json是什么
json是什么

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

546

2023.08.23

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

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

326

2023.10.13

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

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

81

2025.09.10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

910

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

366

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.30

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

251

2023.09.22

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

64

2026.02.28

热门下载

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

精品课程

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

共101课时 | 9.8万人学习

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

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号