首页 > Java > java教程 > 正文

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

霞舞
发布: 2025-09-09 18:23:33
原创
961人浏览过

使用 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/enum
Message: 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 避免无效枚举值的错误提示的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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