Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 嵌套对象的AJV模式验证_Javascript_Json_Node.js_Jsonschema_Ajv - Fatal编程技术网

Javascript 嵌套对象的AJV模式验证

Javascript 嵌套对象的AJV模式验证,javascript,json,node.js,jsonschema,ajv,Javascript,Json,Node.js,Jsonschema,Ajv,函数返回如下所示的对象: { "answer": { "vehicle_type": 1, "message": "Car" }, "model": "VW", "color": "red" } “答案”对象始终存在。其他字段基于“车辆类型”存在 例如 如果车辆类型=1,则有“型号”和“颜色” 如果车辆类型=2,则有“发动机计数”、“座椅计数”和“机翼计数” 我正在尝试编

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

    {
        "answer": {
           "vehicle_type": 1,
           "message": "Car"
        },
        "model": "VW",
        "color": "red"
    }
“答案”对象始终存在。其他字段基于“车辆类型”存在

例如

如果车辆类型=1,则有“型号”和“颜色”

如果车辆类型=2,则有“发动机计数”、“座椅计数”和“机翼计数”

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

如果“车辆类型”为1,我想将“型号”和“颜色”设置为所需属性。 如果“车辆类型”为2,则需要“发动机计数”、“座椅计数”和“机翼计数”

我正在使用AJV()模式验证器

对我来说,这是有问题的,因为vehicle_type嵌套在“answer”中,而我想要标记为所需的属性位于父对象上。 换句话说,“验证类型”与“模型”或“引擎计数”不在同一级别

我已经有几个不同的方法。。。我也尝试了ajv关键词(switch,if/else/then),但没有任何运气

有什么想法吗?

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