首页 > 解决方案 > 在带有体面错误消息的 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
}

有没有更好的方式来表达这个规则?

标签: arraystuplesjsonschemajson-schema-validator

解决方案


有关条件约束的四种策略的描述,请参阅jsonSchema 属性有条件地要求。在这里,它们按哪种策略产生最佳错误消息的顺序排列。

  1. dependencies: 这是一个非常具体的约束,所以它往往有很大的错误信息。不幸的是,这不适用于您的情况。

  2. if/then:这将在您的情况下产生最好的消息。

  3. 含义:这会产生非常好的错误消息,但不如if/好thenif/then在草案 07 中添加。如果您不能使用 draft-07 或更高版本,这是您最好的选择。

  4. Enum:这是您正在使用的,它会产生如您所见的可怕错误。这是错误消息最糟糕的选择。


推荐阅读