根据父属性或父架构有条件地验证JSON架构 [英] conditionally validate a json schema based on a parent property or parent schema

查看:10
本文介绍了根据父属性或父架构有条件地验证JSON架构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下json架构

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "title": "MySchema",
  "required": ["environment", "datacenter"],
  "properties": {
    "environment": {
      "type": "string",
      "title": "environment",
      "enum": ["DEV", "STG", "PROD"]
    },
    "datacenter": {
      "type": "object",
      "title": "datacenter",
      "properties": {
        "value": {
          "$ref": "#/definitions/datacenter"
        }
      }
    }
  },
  "definitions": {
    "datacenter": {
      "type": "string",
      "enum": [ "devDC1", "devDC2", "stgDC1", "stgDC2", "prodDC1", "prodDC2" ]
    }
  }
}

这里是如何简单地使用它

{
    "$schema": "http://localhost/schemas/v3/env.json",
    "environment": "DEV",
    "datacenter": {
        "value": "devDC1"
    }
}

我尝试做的事情类似于

如果将环境设置为DEV,则我应该只能为数据中心属性值选择devDC1和devDC2,如果我为环境选择stg,则允许使用stgDC1和stgDC2,对于prod也是如此

请注意 架构中的"$ref": "#/definitions/datacenter"实际上正在引用另一个文件

推荐答案

可以使用if+allOf(参见第二个示例here),例如:

  "allOf": [
    {
      "if": {"properties": {"environment": {"const": "DEV"}}},
      "then": {"properties": {"datacenter": {"properties": {"value": {"pattern": "^dev"}}}}}
    },
    {
      "if": {"properties": {"environment": {"const": "STG"}}},
      "then": {"properties": {"datacenter": {"properties": {"value": {"pattern": "^stg"}}}}}
    },
    {
      "if": {"properties": {"environment": {"const": "PROD"}}},
      "then": {"properties": {"datacenter": {"properties": {"value": {"pattern": "^prod"}}}}}
    }
  ]

请注意,除此之外,您还需要将"required": ["value"]添加到/properties/datacenter中(否则"datacenter": {}也将与环境无关地被接受)。

这篇关于根据父属性或父架构有条件地验证JSON架构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆