【问题标题】:AJV schema validation for nested object嵌套对象的 AJV 模式验证
【发布时间】:2017-11-08 01:46:57
【问题描述】:

函数返回如下所示的对象:

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

'Answer' 对象始终存在。其他字段基于“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 嵌套在'answer' 中,而我想根据需要标记的属性位于父对象上。 换言之,“validation_type”与“model”或“engine_count”不在同一级别。

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

有什么想法吗?

【问题讨论】:

    标签: javascript json node.js jsonschema ajv


    【解决方案1】:

    您可以为此使用“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"
          ]
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-06-10
      • 2017-10-23
      • 2022-01-23
      • 1970-01-01
      • 2019-11-08
      • 2018-06-05
      • 2018-10-21
      • 2020-01-20
      • 1970-01-01
      相关资源
      最近更新 更多