arrays - 在带有体面错误消息的 json 模式中创建条件数组的最佳方法
问题描述
我想在 JSON 模式中约束一个(元组)数组,并获得不错的错误消息,但到目前为止我没有成功。
该数组由 2 项组成,第一项是字符串,第二项是对象。对象中允许/需要的属性取决于字符串。2个有效的例子是:
{
"color": [ "white", { "a white property": 42 }]
}
和
{
"color": [ "black", { "this is a black property": "tAttUQoLtUaE" }]
}
作为参考,打字稿中的类型将定义为:
type MyObject = {
color:
| ["white", {
"a white property": number
}]
| ["black", {
"this is a black property": string
}]
}
我试过'oneOf'(见下文),它可以工作,但如果文件无效,则错误消息是无法理解的。您可以在 jsonschemavalidator.org 上试用此实例:
{
"color": [ "black", {
"XXX": "foo"
}]
}
我的尝试:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/root.json",
"type": "object",
"required": [
"color"
],
"properties": {
"color": {
"oneOf": [
{
"type": "array",
"items": [
{
"enum": [ "white"]
},
{
"type": "object",
"required": [ "a white property" ],
"additionalProperties": false,
"properties": {
"a white property": {
"type": "number"
}
}
}
]
},
{
"type": "array",
"items": [
{
"enum": ["black"]
},
{
"type": "object",
"required": [ "this is a black property" ],
"additionalProperties": false,
"properties": {
"this is a black property": {
"type": "string"
}
}
}
]
}
]
}
},
"additionalProperties": false
}
有没有更好的方式来表达这个规则?
解决方案
有关条件约束的四种策略的描述,请参阅jsonSchema 属性有条件地要求。在这里,它们按哪种策略产生最佳错误消息的顺序排列。
dependencies
: 这是一个非常具体的约束,所以它往往有很大的错误信息。不幸的是,这不适用于您的情况。if
/then
:这将在您的情况下产生最好的消息。含义:这会产生非常好的错误消息,但不如
if
/好then
。if
/then
在草案 07 中添加。如果您不能使用 draft-07 或更高版本,这是您最好的选择。Enum:这是您正在使用的,它会产生如您所见的可怕错误。这是错误消息最糟糕的选择。
推荐阅读
- postgresql - 有没有办法在不使用 PL/pgSQL 的情况下用 Postgres 的 SQL 方言编写动态查询?
- autodesk-forge - 创建revit文件时revit设计自动化api是否支持纹理uv
- node.js - npm 错误!在安装 next.js 时
- php - 当一部分为空时,Symfony 删除 ManyToMany 相关对象?
- java - 用于循环的 Java REST API
- r - RStudio 服务器无法连接到服务
- azure-ad-b2c - 为来宾用户受邀者从 Azure AD 提取报告
- ios13 - 更新到 Xcode 11 后无法启动应用程序问题
- powerapps - 如何修复powerapps中的“必填”字段?
- c# - 在一定数量的行之后拆分datagridview