Arrays 在json模式中生成具有适当错误消息的条件数组的最佳方法

Arrays 在json模式中生成具有适当错误消息的条件数组的最佳方法,arrays,tuples,jsonschema,json-schema-validator,Arrays,Tuples,Jsonschema,Json Schema Validator,我想在JSON模式中约束一个(元组)数组,并获得适当的错误消息,但到目前为止我没有成功 数组由两个项组成,第一个是字符串,第二个是对象。对象中允许/需要的属性取决于字符串。 2个有效的例子是: { "color": [ "white", { "a white property": 42 }] } 及 作为参考,typescript中的类型将定义为: type MyObject = { color: | ["white", { "a white prope

我想在JSON模式中约束一个(元组)数组,并获得适当的错误消息,但到目前为止我没有成功

数组由两个项组成,第一个是字符串,第二个是对象。对象中允许/需要的属性取决于字符串。 2个有效的例子是:

{
    "color": [ "white", { "a white property": 42 }]
}

作为参考,typescript中的类型将定义为:

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
}
是否有更好的方法来表达此规则?

有关条件约束的四种策略的描述,请参见。这里是按照哪个策略生成最佳错误消息的顺序

  • 依赖关系
    :这是一个非常特定的约束,因此它往往会有大量错误消息。不幸的是,这在你的情况下不起作用

  • 如果
    /
    那么
    :这将在您的情况下产生最好的消息

  • 含义:这会产生相当好的错误消息,但不如
    如果
    /
    那么
    那么好<代码>如果/
    ,则在草案-07中添加了
    。如果您不能使用draft-07或更高版本,这是您的最佳选择

  • Enum:这是您正在使用的,它会产生可怕的错误,正如您所看到的。这是错误消息最糟糕的选项

  • {
        "$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
    }