需要基于枚举值的 JSON 模式验证属性

问题描述 投票:0回答:1
{
    "type": "object",
    "properties": {
        "FileType": { "type": "string" },
        "Version": { "type": "string" },
        "Expt": 
          {
            "type": "object",
            "properties": 
              {
                "design": { "type": "string","enum": ["TS", "DR", "BC", "DP"] }
              },
            "required": ["design"],
            "additionalProperties": false
         },
       "Rout": 
         {
          "type": "object",
          "properties": 
            {
             "timeUnits": {"type": "string", "enum": ["sec", "min", "hr"] },
             "setTime": { "type": "number", "minimum": 0.0, "maximum": 50 }
           },
           "required": ["timeUnits"],
           "additionalProperties": false
        }
     }
 }
  1. 如果
    design
    ==
    DR
    BC
    那么
    Rout
    ->
    setTime
    应该存在
  2. 如果
    design
    ==
    TS
    DP
    ,则
    setTime
    不应该存在

无效实例

setTime
不允许


    {
    "Expt": { "design": "TS" },
    "Rout": { "timeUnits": "sec", "setTime":12 }
    }

setTime
应该是
required


    {
    "Expt": { "design": "BC"},
    "Rout": { "timeUnits": "sec" }
    }


有效实例


    {
    "Expt": { "design": "TS" },
    "Rout": { "timeUnits": "sec" }
    }


    {
    
    "Expt": { "design": "BC" },
    "Rout": { "timeUnits": "sec", "setTime":12 }
    
    }

我在模式中尝试了 if-then-else、oneof、allof 的多种组合,但无法验证

setTime
是否为
BC
DR
。我预计
setTime
会出现错误,其值为
TS
DP

jsonschema json-schema-validator
1个回答
0
投票

这可以通过您指出的多种方式完成,这里我们有一个示例

oneOf

每个子模式几乎都是重复的,但我们使用

enum
来创建模式之间的差异。
Rout
已移至
$defs
以便重用,然后定义
setTime
,并且
required
unevaluatedProperties
会阻止第一个
Rout
模式的
oneOf
模式中的任何其他属性。

unevaluatedProperties
限制在第二个模式中使用
setTime

{
    "$schema": "https://json-schema.org/draft/2020-12/schema",
    "oneOf": [
        {
            "type": "object",
            "additionalProperties": false,
            "required": [
                "Expt",
                "Rout"
            ],
            "properties": {
                "FileType": {
                    "type": "string"
                },
                "Version": {
                    "type": "string"
                },
                "Expt": {
                    "type": "object",
                    "properties": {
                        "design": {
                            "type": "string",
                            "enum": [
                                "DR",
                                "BC"
                            ]
                        }
                    },
                    "required": [
                        "design"
                    ],
                    "additionalProperties": false
                },
                "Rout": {
                    "$ref": "#/$defs/Rout",
                    "required": [
                        "setTime"
                    ],
                    "properties": {
                        "setTime": {
                            "type": "number",
                            "minimum": 0,
                            "maximum": 50
                        }
                    },
                    "unevaluatedProperties": false
                }
            }
        },
        {
            "type": "object",
            "additionalProperties": false,
            "required": [
                "Expt",
                "Rout"
            ],
            "properties": {
                "FileType": {
                    "type": "string"
                },
                "Version": {
                    "type": "string"
                },
                "Expt": {
                    "type": "object",
                    "properties": {
                        "design": {
                            "type": "string",
                            "enum": [
                                "TS",
                                "DP"
                            ]
                        }
                    },
                    "required": [
                        "design"
                    ],
                    "additionalProperties": false
                },
                "Rout": {
                    "$ref": "#/$defs/Rout",
                    "unevaluatedProperties": false
                }
            }
        }
    ],
    "$defs": {
        "Rout": {
            "type": "object",
            "properties": {
                "timeUnits": {
                    "type": "string",
                    "enum": [
                        "sec",
                        "min",
                        "hr"
                    ]
                }
            },
            "required": [
                "timeUnits"
            ]
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.