使用 JSON Schema 中的 oneOf 避免无效枚举值的错误提示

使用 json schema 中的 oneof 避免无效枚举值的错误提示

本文旨在帮助开发者理解并解决在使用 JSON Schema 验证 JSON 数据时,由于 oneOf 约束可能导致的“无效枚举值”的错误提示问题。我们将通过示例代码,详细解释错误产生的原因,并提供相应的解决方案,以确保 JSON Schema 验证的准确性和可读性。

在使用 JSON Schema 验证 JSON 数据时,oneOf 关键字用于指定数据必须符合多个子模式中的一个。然而,当数据不符合任何一个子模式时,验证器会报告每个子模式的验证失败信息,这可能导致一些“误报”,例如“Value is not defined in enum”。理解这些错误信息背后的原因对于编写健壮的 JSON Schema 至关重要。

问题分析

考虑以下 JSON Schema 和 JSON 数据:

JSON Schema:

{  "$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 Data:

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

使用此 Schema 验证此 JSON 数据时,可能会得到以下错误:

Find JSON Path Online Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30 查看详情 Find JSON Path Online

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

第一个错误信息 “Value “Test12″ is not defined in enum” 看似不正确,因为 “Test12” 确实在顶级 eventName 的 enum 中定义了。但实际上,这个错误是 oneOf 导致的。 oneOf 中的第二个子模式要求 eventName 必须是 “Test1”, “Test2” 或 “Test3” 之一。由于 “Test12” 不满足这个条件,因此验证器报告了这个错误。 第二个错误信息 “-5 is less than minimum value of 0” 是正确的,因为它违反了 oneOf 中第一个子模式的 exclusiveMinimum 约束。

解决方案

虽然 oneOf 的这种行为是符合规范的,但在实际应用中,我们可能希望只看到最相关的错误信息。解决这个问题的一种方法是重新设计 Schema,避免使用 oneOf,而是使用更精确的约束。

例如,可以将 Schema 修改为:

{  "$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"        }      }    }  },  "if": {    "properties": {      "eventName": {        "enum": ["Test10", "Test12"]      }    }  },  "then": {    "properties": {      "eventPayload": {        "properties": {          "totalAmount": {            "exclusiveMinimum": 0          }        }      }    }  },  "else": {    "properties": {      "eventPayload": {        "properties": {          "totalAmount": {            "exclusiveMaximum": 0          }        }      }    }  }}

在这个修改后的 Schema 中,我们使用了 if-then-else 结构来根据 eventName 的值应用不同的约束。如果 eventName 是 “Test10” 或 “Test12″,则 totalAmount 必须大于 0;否则,totalAmount 必须小于 0。 这样,当 eventName 为 “Test12″,而 totalAmount 为 -5 时,只会报告 “Integer -5 is less than minimum value of 0” 这一个错误,避免了不必要的 “Value “Test12″ is not defined in enum” 错误。

注意事项

使用 oneOf 时,要仔细分析验证器返回的错误信息,理解其背后的原因。尽量使用更精确的约束(如 if-then-else)来替代 oneOf,以减少误报,提高 Schema 的可读性和可维护性。选择合适的 JSON Schema 验证器。不同的验证器可能产生不同的错误信息,有些验证器可能提供更详细或更友好的错误提示。

总结

oneOf 是 JSON Schema 中一个强大的关键字,但需要谨慎使用。理解其工作原理以及可能产生的副作用,可以帮助我们编写更健壮、更易于理解的 JSON Schema。 通过重新设计 Schema 结构,例如使用 if-then-else 结构,可以有效地避免由于 oneOf 导致的无效枚举值错误提示,提高 JSON Schema 验证的准确性和效率。

以上就是使用 JSON Schema 中的 oneOf 避免无效枚举值的错误提示的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
疑似魅族 22 真机曝光 后置方形镜头模组 这颜值打几分?
上一篇 2025年11月3日 12:54:02
DeepSeek部署在云服务器时要注意什么 部署环境配置及安全策略建议
下一篇 2025年11月3日 12:54:03

相关推荐

  • Prestashop分类页描述与分页:SEO考量及前端行为解析

    本文深入探讨Prestashop电商平台中分类页面描述在分页操作时消失的常见现象。我们将解析其背后的技术原理,重点从搜索引擎优化(SEO)角度阐述为何此行为并非核心问题,并强调确保分类描述在首页面加载时的完整性至关重要。同时,文章也提供若需自定义此行为的思路。 Prestashop分类页描述的分页行…

    2026年9月23日
    100
  • 使用PHP和AJAX对POST方法获取的医生列表进行A-Z排序

    本文介绍如何在使用POST方法获取医生列表后,通过PHP和AJAX实现A-Z排序功能。首先,在search.php页面创建一个表单,保存用于重定向到该页面的POST数据。然后,使用PHP函数对医生数据进行排序,并通过AJAX将排序后的结果动态更新到页面上,从而实现无需刷新页面的排序体验。 1. 修改…

    2026年9月23日
    000
  • 使用PHP和Ajax实现搜索结果的A-Z排序

    在PHP搜索结果页面实现A-Z排序功能,可以极大地提升用户体验。结合Ajax技术和PHP后端排序逻辑,我们可以在不刷新页面的情况下实现排序功能。以下将详细介绍实现步骤。 1. 前端:创建排序表单和Ajax请求 首先,需要在 search.php 页面中创建一个表单,用于触发排序操作。这个表单可以包含…

    2026年9月23日
    000
  • HTML中无法链接本地脚本源的问题解析与解决方案

    本文旨在解决在本地HTML文件中无法正确链接JavaScript脚本的问题,尤其是在使用p5.js等库时。我们将探讨常见原因,并提供无需Web服务器即可成功运行HTML、JavaScript和CSS代码的有效方法。通过修改HTML结构,确保脚本正确加载和执行,从而避免页面无法渲染的情况。 在本地开发…

    2026年9月23日
    1100
  • Java中利用正则表达式从JSON数组中提取独立JSON对象

    本文详细介绍了如何利用Java正则表达式从格式化的JSON数组中提取独立的JSON对象字符串。通过一个具体的代码示例,文章展示了如何构建一个精确的正则表达式模式来匹配并分离数组中的每个JSON实体,并提供了Java代码实现,包括去除多余空白字符的步骤,最终实现将JSON数组解析为可操作的独立对象字符…

    2026年9月23日
    200
  • PrestaShop分类描述在分页时隐藏的机制与SEO考量

    本教程探讨PrestaShop商店中分类描述在分页时消失的现象。我们将解释为何在访问第二页或后续页面时,分类描述不再显示,甚至在返回第一页后也可能消失。文章将从技术实现和搜索引擎优化(SEO)的角度分析这一行为,强调其通常并非问题,并提供专业见解。 PrestaShop分类描述分页行为解析 在pre…

    2026年9月23日
    100
  • Java中使用栈验证JSON字符串结构:深入理解与实践

    本文探讨了在Java中利用栈验证JSON字符串结构的核心原理与常见陷阱。我们将分析一种初始实现中处理引号、转义字符及字符串内部结构字符的不足,并提供一个更健壮的栈基方法,以准确判断JSON的括号、方括号和引号是否平衡,同时纠正关于不完整JSON片段有效性的常见误解。 1. JSON结构与验证的重要性…

    2026年9月23日
    100
  • 如何在mysql中优化多表JOIN查询

    答案:优化MySQL多表JOIN需创建关联字段索引、提前过滤数据、选择合适JOIN类型与表序、利用EXPLAIN分析执行计划,并定期更新统计信息以提升查询效率。 在MySQL中优化多表JOIN查询,关键在于减少数据扫描量、提升连接效率,并合理利用索引和执行计划。以下是一些实用的优化策略。 1. 确保…

    2026年9月23日
    300
  • Java Web项目在无Maven/Eclipse环境下生成WAR包的实践指南

    本文详细介绍了如何在没有Maven或Eclipse等集成开发环境或构建工具的情况下,为Java Web项目手动或通过Apache Ant工具生成WAR文件。教程涵盖了WAR文件的基本结构、使用Ant进行编译和打包的具体步骤,并提供了Ant构建脚本示例,旨在帮助开发者理解并实践WAR包的独立构建过程。…

    2026年9月23日
    100
  • PHP教程:解析和访问包含JSON字符串的数组值

    本教程旨在指导读者如何高效地从PHP数组中提取数据,特别是当数组的每个元素都是一个JSON格式的字符串时。文章将详细介绍如何利用json_decode()函数将JSON字符串转换为PHP数组,并通过示例代码演示循环遍历和直接访问特定字段的方法,帮助您轻松处理此类复杂数据结构。 理解数据结构 在php…

    2026年9月23日
    200
  • Java中基于栈验证JSON字符串结构有效性的方法

    本文探讨了在Java中利用栈(Stack)数据结构验证JSON字符串结构有效性的方法。我们将分析一个常见的基于栈的实现示例,指出其在处理字符串内部字符、引号平衡以及转义字符方面的潜在缺陷。文章将提供一个改进的解决方案,并强调此方法主要用于结构匹配,而非完整的JSON语法验证,同时建议生产环境中使用专…

    2026年9月23日
    200
  • Java JSON字符串有效性验证:基于栈的实现与常见陷阱

    本文深入探讨了使用Java栈结构验证JSON字符串有效性的方法。通过分析一个常见错误示例,详细阐述了在处理括号、方括号以及字符串引号时的正确逻辑,特别强调了字符串内部字符(包括转义字符)不应影响结构平衡的原则,并提供了改进思路,旨在帮助开发者构建健壮的JSON验证器。 JSON结构与栈的适用性 JS…

    2026年9月23日
    100
  • PHP数组中内嵌JSON字符串值的解析与访问教程

    本教程详细介绍了如何在PHP中高效地解析和访问包含JSON格式字符串的数组元素。通过使用json_decode()函数,可以将这些JSON字符串转换为可操作的PHP数组或对象,从而轻松提取所需的shortname和fullname等字段值,并提供了遍历和直接访问的示例代码及注意事项。 在php开发中…

    2026年9月23日
    200
  • Vue.js 项目中实现练习进度保存的策略与实践

    本文将探讨在vue.js项目中实现用户练习进度保存的最佳实践。针对需要跨会话保留用户进度的场景,我们将重点介绍如何利用浏览器localstorage进行数据持久化,包括数据的序列化与反序列化、在关键生命周期钩子中加载与保存数据,以及相关的注意事项,确保用户能够从上次中断的地方继续练习。 在开发基于V…

    2026年9月23日
    100
  • PHPRestfulAPI怎么开发_PHP构建高效安全的RestfulAPI教程

    答案:本文介绍如何用PHP构建高效安全的Restful API,涵盖设计规范、项目结构、数据库操作、安全机制、统一响应格式及性能优化。遵循Restful风格使用标准HTTP方法与状态码,通过index.php统一入口路由请求至控制器;采用PDO预处理防止SQL注入,结合JWT实现认证授权,确保输入验…

    2026年9月22日
    200
  • Karate教程:优雅处理GET请求中的复杂查询参数(含日期范围)

    本教程将详细介绍在Karate框架中如何正确发送包含复杂查询参数(特别是带有方括号的参数名,如filters[start_date])的GET请求。我们将通过实际示例,演示如何利用Karate的* param关键字优雅地构建URL,确保参数被正确编码并传递给后端服务,尤其适用于日期范围等场景。 理解…

    2026年9月22日
    300
  • PHP中操作JSON数组对象:添加与修改属性的实践指南

    本教程详细阐述如何在php中高效地处理包含对象的json数组。我们将学习如何利用`json_decode()`将json字符串转换为php数据结构,进而为数组中的现有对象添加或修改属性,并通过`json_encode()`将其转换回json字符串,避免手动构建json的常见错误。 在现代Web开发中…

    2026年9月22日
    1300
  • VS Code启动优化:扩展延迟加载与缓存策略

    合理管理扩展加载与缓存可显著提升VS Code启动速度。通过配置activationEvents实现按需激活、利用Extension Storage和CachedDataDir优化数据读取,并禁用非核心扩展,结合“Developer: Show Running Extensions”分析耗时,有效缩…

    2026年9月22日
    100
  • Java项目类路径管理:引用与实现外部.class文件定义的接口

    在Java项目中引用并实现由.class文件定义的接口,核心在于正确配置Java的类路径(Classpath)。本文将详细介绍类路径的概念、其重要性,以及如何在命令行和集成开发环境(IDE)中有效地设置类路径,确保编译器和JVM能够找到所需的.class文件,从而成功编译和运行包含外部接口实现的代码…

    2026年9月22日
    300
  • 理解Next.js与Firestore数据获取中的多次读取现象及优化

    Next.js应用在获取单个Firestore文档时,可能遭遇实际读取次数远超预期的现象,且数据获取函数被多次调用。本文将深入探讨Firestore的计费机制、Next.js数据获取的生命周期特点,并提供使用React cache进行请求去重及其他优化策略,以有效管理Firestore读取成本和提升…

    2026年9月22日
    100

发表回复

登录后才能评论
关注微信