使用 JSON Schema 的 oneOf 校验时避免误报枚举错误

使用 json schema 的 oneof 校验时避免误报枚举错误

本文旨在解决在使用 JSON Schema 的 oneOf 关键字进行校验时,可能出现的“Value is not defined in enum”的误报问题。通过分析问题原因和提供解决方案,帮助开发者更准确地理解和使用 oneOf 校验规则,从而避免不必要的错误提示。

在使用 JSON Schema 验证 JSON 数据时,oneOf 关键字用于指定数据必须符合多个子 Schema 中的一个。然而,在某些情况下,即使数据符合其中一个子 Schema,验证器仍然可能报告其他子 Schema 中的枚举错误,导致误报。

问题分析

出现这种误报的原因在于,JSON Schema 验证器会尝试验证数据是否符合 oneOf 中 所有 的子 Schema。当数据不符合某个子 Schema 的枚举约束时,验证器就会报告相应的错误。即使数据已经成功通过了另一个子 Schema 的验证,这个错误仍然会被显示出来。

示例代码

以下是一个示例 JSON Schema,用于验证包含 eventName 和 eventPayload 属性的 JSON 对象:

{  "$schema": "https://json-schema.org/draft/2019-09/schema",  "type": "object",  "properties": {    "eventName": {      "type": "string",      "enum": ["Test10", "Test12", "Test1", "Test2", "Test3"]    },    "eventPayload": {      "type": "object",      "properties": {        "totalAmount": {          "type": "number"        }      }    }  },  "oneOf": [    {      "properties": {        "eventName": {          "enum": ["Test10", "Test12"]        },        "eventPayload": {          "properties": {            "totalAmount": {              "exclusiveMinimum": 0            }          }        }      }    },    {      "properties": {        "eventName": {          "enum": ["Test1", "Test2", "Test3"]        },        "eventPayload": {          "properties": {            "totalAmount": {              "exclusiveMaximum": 0            }          }        }      }    }  ]}

以下是一个示例 JSON 数据:

{  "eventName": "Test12",  "eventPayload": {    "totalAmount": -5  }}

使用上述 JSON Schema 验证该 JSON 数据时,会产生以下错误:

Message: Value "Test12" is not defined in enum.Schema path: #/oneOf/1/properties/eventName/enumMessage: Integer -5 is less than minimum value of 0.Schema path: #/oneOf/0/properties/eventPayload/properties/totalAmount/minimum

可以看到,即使 eventName 的值为 “Test12” 符合第一个子 Schema 的枚举约束,验证器仍然报告了第二个子 Schema 中的枚举错误。

解决方案

AVCLabs AVCLabs

AI移除视频背景,100%自动和免费

AVCLabs 268 查看详情 AVCLabs

虽然无法完全避免验证器报告所有子 Schema 的错误,但可以采取一些策略来减少误报的影响:

仔细设计 Schema 结构: 确保 oneOf 中的子 Schema 尽可能地互斥。如果子 Schema 之间存在重叠的枚举值,可能会增加误报的概率。

忽略无关的错误信息: 在处理验证结果时,可以根据实际情况忽略那些与成功匹配的子 Schema 不相关的错误信息。例如,如果数据成功通过了第一个子 Schema 的验证,则可以忽略第二个子 Schema 的枚举错误。

使用自定义验证逻辑: 如果需要更精确的控制,可以考虑使用自定义验证逻辑来替代 oneOf 关键字。例如,可以使用编程语言编写代码来检查数据是否符合特定的条件。

总结

oneOf 关键字是 JSON Schema 中一个强大的工具,可以用于指定数据必须符合多个子 Schema 中的一个。但是,在使用 oneOf 时,需要注意可能出现的枚举误报问题。通过仔细设计 Schema 结构、忽略无关的错误信息或使用自定义验证逻辑,可以有效地减少误报的影响,从而更准确地验证 JSON 数据。

注意事项

不同的 JSON Schema 验证器可能对 oneOf 的实现方式略有不同。因此,在使用 oneOf 时,建议仔细阅读所使用的验证器的文档,了解其具体的行为和限制。

以上就是使用 JSON Schema 的 oneOf 校验时避免误报枚举错误的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/746131.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月25日 17:44:59
下一篇 2025年11月25日 17:45:31

相关推荐

  • C++模板在人工智能中的潜力?

    c++++ 模板在人工智能中具备以下潜力:提高运行时效率:通过模板化算法,编译器可生成针对特定数据类型优化的汇编代码。降低代码开销:利用模板,开发人员无需为不同数据类型重复编写代码。提高可维护性:元编程和类型推导有助于创建类型安全的字符串常量,提高代码可读性和可维护性。 C++ 模板在人工智能中的潜…

    2025年12月18日
    000
  • C++技术与其他现代编程语言的优缺点对比

    c++++ 与其他现代编程语言的优缺点对比为:c++ 优势: 高性能、低级控制、丰富的库生态系统。c++ 劣势: 学习曲线陡峭、手动内存管理、可移植性受限。python 优势: 学习曲线平滑、广泛的库支持、解释型语言。java 优势: 平台无关、自动内存管理、广泛应用。javascript 优势: …

    2025年12月18日
    000
  • 如何使用工具和库来优化C++程序?

    现代 c++++ 开发中,利用工具和库进行优化至关重要。valgrind、perf 和 lldb 等工具可识别瓶颈、测量性能并进行调试。eigen、boost 和 opencv 等库可提升线性代数、网络 i/o 和计算机视觉等领域的效率。例如,使用 eigen 可优化矩阵乘法,perf 可分析程序性…

    2025年12月18日
    000
  • C语言的应用领域及重要性

    C语言的应用领域及重要性 C语言作为一种高效、灵活的编程语言,在计算机领域有着广泛的应用。无论是操作系统、嵌入式系统还是应用软件开发,C语言都扮演着重要的角色。本文将介绍C语言在各个领域的应用,并通过具体代码示例展示其重要性。 操作系统开发 在操作系统开发领域,C语言是首选的编程语言之一。C语言具有…

    2025年12月17日
    000
  • C语言与其他编程语言的比较:优势和限制分析

    C语言与其他编程语言的比较:优势和限制分析 概述: 在计算机科学领域中,编程语言被广泛使用来编写软件和开发应用程序。不同的编程语言有不同的特点和优势。而在这些编程语言中,C语言是一种被广泛使用和熟知的语言之一。本文将探讨C语言与其他主要编程语言之间的比较,重点分析C语言的优势和限制。 优势: 立即学…

    2025年12月17日
    000
  • C语言编辑器推荐:选择最适合你的工具

    在当今的计算机科学领域,C语言被广泛用于开发各种应用程序和系统软件。而在编写C语言代码时,选择一款合适的编辑器是非常重要的。一个好的编辑器可以提高开发效率、简化代码编写和调试过程。本文将介绍几款常用的C语言编辑器,并根据其特点和功能,帮助读者选择最适合自己的工具。 首先,我们来介绍一款非常受欢迎的C…

    2025年12月17日
    000
  • 如何在C语言编程中实现中文字符的编码和解码?

    在现代计算机编程中,C语言是一种非常常用的编程语言之一。尽管C语言本身并不直接支持中文编码和解码,但我们可以使用一些技术和库来实现这一功能。本文将介绍如何在C语言编程软件中实现中文编码和解码。 1、点击☞☞☞java速学教程(入门到精通)☜☜☜直接学习 2、点击☞☞☞python速学教程(入门到精通…

    2025年12月17日
    000
  • 揭秘C语言编译器:五款必备工具

    C语言编译器大揭秘:五个你必须知道的工具 引言:在我们学习和使用C语言的过程中,编译器无疑是一个至关重要的工具。它可以将我们所写的高级语言代码转化为机器语言,使计算机能够理解和运行我们的程序。但是,大多数人对于编译器的工作原理和内部机制还知之甚少。本文将揭示C语言编译器的五个你必须知道的工具,并使用…

    2025年12月17日
    000
  • 各编程语言中字符常量的表示方法和规则详解

    如何在不同编程语言中表示字符常量? 导语:在编程过程中,字符常量是不可变的值,用来表示单个字符。不同的编程语言有不同的方式来表示字符常量。本文将介绍几种常见的编程语言中表示字符常量的方式,并给出具体的代码示例。 一、C语言表示字符常量:在C语言中,字符常量用单引号(’)来表示。下面是一些…

    2025年12月17日
    000
  • 有哪些不同的计算机语言?

    编程语言用来以计算机可以理解的语言给计算机发出指令。 计算机语言分为三种类型,如下所示: 机器语言符号语言高级语言 机器语言 计算机是一台机器。由于它的内存只能存储1和0,必须以一串1和0的流的形式给计算机发出指令,即二进制代码。 这些对机器来说很容易理解。 以二进制代码编写的程序可以直接输入计算机…

    2025年12月17日
    000
  • C# Avalonia如何集成Entity Framework Core Avalonia EF Core教程

    在 Avalonia 中集成 EF Core 可行,关键在于异步操作、DI 注入 DbContextFactory 及正确管理生命周期;需避免 UI 线程阻塞,推荐用 AddDbContextFactory 而非 Scoped 或 Singleton 注册。 在 Avalonia 中集成 Entit…

    2025年12月17日
    000
  • MAUI怎么调用REST API MAUI网络请求HttpClient方法

    在 MAUI 中调用 REST API 应使用单例注册的 HttpClient,避免频繁创建导致套接字耗尽;通过构造函数注入后,可用 GetFromJsonAsync 安全获取 JSON 数据并映射为 record 类型。 在 MAUI 中调用 REST API,最常用、推荐的方式就是使用 Http…

    2025年12月17日
    000
  • Dapper如何封装通用仓储 Dapper Repository模式实现方法

    Dapper通用仓储应借鉴EF思想而非照搬,核心是泛型约束+手写SQL灵活性:定义IRepository接口(GetById/Find/Insert/Update/Delete),实现类通过特性识别主键与列映射,动态生成安全SQL,支持事务参数,分页由具体方法处理,查询逻辑下沉至具体仓储,连接由DI…

    2025年12月17日
    000
  • MAUI怎么进行macOS平台开发 MAUI Mac Catalyst指南

    MAUI 对 macOS 的支持是原生集成而非 Mac Catalyst,直接编译为基于 AppKit 的原生应用;需在 macOS 系统上开发,安装 .NET 10.0、Xcode 15.3+ 和 Visual Studio for Mac 或 VS Code + C# Dev Kit,并在项目文…

    2025年12月17日
    000
  • Avalonia如何调用文件选择对话框 Avalonia OpenFileDialog使用教程

    Avalonia中调用文件选择对话框需使用OpenFileDialog类,必须传入已激活的Window实例并await ShowAsync(),支持跨平台且返回绝对路径;Filters设置文件类型过滤器,AllowMultiple控制多选,无需额外NuGet包(Avalonia 11+已内置)。 在…

    2025年12月17日
    000
  • C# MAUI怎么实现文件上传 MAUI上传文件到服务器

    .NET MAUI 文件上传需三步:1. 申请存储读取权限(Android/iOS);2. 用 FilePicker.PickAsync 选文件并读为字节数组;3. 用 HttpClient 构造 MultipartFormDataContent 发送,注意流一次性及前后端字段名、MIME 对齐。 …

    2025年12月17日
    000
  • MAUI怎么打包安卓应用 MAUI APK打包发布教程

    MAUI打包安卓APK需四步:改格式为apk、配置AndroidManifest.xml权限与基础信息、通过发布流程生成、添加签名。缺一将导致无法安装或闪退,签名密钥须备份以防更新失败。 MAUI 打包安卓 APK 不难,但几个关键步骤漏掉一个,就装不上或一启动就闪退。核心就四步:改格式、配权限、打…

    2025年12月17日
    000
  • SignalR怎么实现实时通信 SignalR Hub推送消息方法

    SignalR 通过 Hub 建立服务端与客户端的双向长连接实现实时通信,支持自动降级传输方式。Hub 管理连接、分组与消息推送,客户端需调用 start() 并监听指定函数名接收消息。 SignalR 实现实时通信,核心就是靠 Hub(集线器) 建立服务端与客户端的双向长连接,并通过它来主动推送消…

    2025年12月17日
    000
  • Avalonia怎么实现一个类似VSCode的布局 Avalonia可停靠窗口

    Avalonia 本身不内置可停靠布局系统,但可通过第三方库 Avalonia.Dock 实现接近 VSCode 的体验;它支持拖拽停靠、浮动窗口、布局保存/恢复、跨平台及主题适配,并提供事件链与模型接口用于状态管理与扩展。 Avalonia 本身不内置类似 VSCode 的可停靠(Docking)…

    2025年12月17日
    000
  • MAUI怎么进行Windows平台开发 MAUI WinUI3开发教程

    MAUI for Windows 基于 WinUI 3 运行时,需 VS 2022 17.4+、.NET SDK 6.0+/8.0+、Windows SDK 及 maui-windows 工作负载;默认生成桌面 EXE,支持条件编译调用原生 WinUI API,可选 MSIX 打包。 MAUI(.N…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信