3

函数返回看起来像这样的对象:

    {
        "answer": {
           "vehicle_type": 1,
           "message": "Car"
        },
        "model": "VW",
        "color": "red"
    }

“答案”对象始终存在。其他字段基于“vehicle_type”。

例如

如果vehicle_type = 1,则有“模型”和“颜色”。

如果vehicle_type = 2,则有“engine_count”、“seat_count”和“wing_count”。

我正在尝试编写 JSON 模式,我将使用它来验证返回的对象。

如果“vehicle_type”为 1,我想将“model”和“color”设置为必需属性。如果“vehicle_type”为 2,则需要“engine_count”、“seat_count”和“wing_count”。

我正在使用 AJV ( https://github.com/epoberezkin/ajv ) 架构验证器。

对我来说,这是有问题的,因为vehicle_type 嵌套在“答案”中,而我想根据需要标记的属性位于父对象上。换句话说,“validation_type”与“model”或“engine_count”不在同一级别。

我已经有几种不同的方法了...我也尝试了 ajv-keywords (switch, if/else/then) 但我没有任何运气

有任何想法吗?

4

1 回答 1

5

您可以为此使用“oneOf”属性。

您将拥有“一种”车辆类型 1 或类型 2。类型 1 具有某些必需的属性,而类型 2 具有不同的必需属性。

例如:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://some.site.somewhere/entry-schema#",
  "oneOf": [
    {"$ref": "#/definitions/type1"},
    {"$ref": "#/definitions/type2"}
  ],
  "definitions": {
    "type1": {
      "type": "object",
      "properties": {
        "answer": {
          "type": "object",
          "properties": {
            "vehicle_type": {
              "type": "integer",
              "enum": [1]
            },
            "message": {
              "type": "string"
            }
          }
        },
        "model": {
          "type": "string"
        },
        "color": {
          "type": "string"
        }
      },
      "required": [
        "model",
        "color"
      ]
    },
    "type2": {
      "type": "object",
      "properties": {
        "answer": {
          "type": "object",
          "properties": {
            "vehicle_type": {
              "type": "integer",
              "enum": [2]
            },
            "message": {
              "type": "string"
            }
          }
        },
        "engine_count": {
          "type": "integer"
        },
        "seat_count": {
          "type": "integer"
        },
        "wing_count": {
          "type": "integer"
        }
      },
      "required": [
        "engine_count",
        "seat_count",
        "wing_count"
      ]
    }
  }
}
于 2017-06-07T01:03:53.627 回答