AJV 模式未按预期工作,当属性为布尔值时,这似乎是常见问题

问题描述 投票:0回答:1

ajv 模式似乎失败了,不知道为什么会发生这种情况

速度 ajv 方案

{
  "$schema": "http://json-schema.org/draft-07/schema#",
    "title": "Update app config Support & Ticketing",
      "type": "object",
        "properties": {
    "servicenowEnabled": {
      "type": "boolean"
    },
    "servicenowClientId": {
      "type": "string"
    },
    "servicenowClientSecret": {
      "type": "string"
    },
    "servicenowBaseUrl": {
      "type": "string",
        "format": "regex",
          "pattern": ".*service-now.com$"
    },
    "servicenowKnowledgeBaseEnabled": {
      "type": "boolean"
    },
    "servicenowKnowledgeBaseSelected": {
      "type": "object",
        "properties": {
        "showAll": {
          "type": "boolean"
        },
        "selectedList": {
          "type": "array",
            "items": {
            "type": "object"
          },
          "properties": {
            "id": {
              "type": "string",
                "minLength": 1
            },
            "name": {
              "type": "string",
                "minLength": 1
            }
          }
        }
      },
      "required": [
        "showAll"
      ],
        "if": {
        "properties": {
          "showAll": {
            "const": true
          }
        }
      },
      "then": {
        "properties": {
          "selectedList": {
            "const": []
          }
        }
      },
      "else": {
        "properties": {
          "selectedList": {
            "minItems": 1
          }
        }
      }
    },
    "servicenowKnowledgeBaseName": {
      "type": "string",
        "minLength": 1
    },
    "servicenowKnowledgeBaseUrl": {
      "type": "string",
        "format": "uri"
    },
    "servicenowTicketsEnabled": {
      "type": "boolean"
    },
    "servicenowTicketsName": {
      "type": "string",
        "minLength": 1
    },
    "servicenowTicketsUrl": {
      "type": "string",
        "format": "uri"
    },
    "servicenowCreateTicketsEnabled": {
      "type": "boolean"
    },
    "servicenowNotificationEnabled": {
      "type": "boolean"
    }
  },
  "allOf": [
    {
      "if": {
        "properties": {
          "servicenowEnabled": {
            "const": true
          }
        }
      },
      "then": {
        "required": [
          "servicenowEnabled",
          "servicenowBaseUrl"
        ]
      },
      "else": {
        "required": [
          "servicenowEnabled"
        ]
      }
    },
    {
      "if": {
        "properties": {
          "servicenowKnowledgeBaseEnabled": {
            "const": true
          }
        }
      },
      "then": {
        "required": [
          "servicenowKnowledgeBaseUrl",
          "servicenowKnowledgeBaseName",
          "servicenowKnowledgeBaseSelected"
        ]
      },
      "else": true
    }
  ],
    "additionalProperties": false
}

的测试用例失败
{
  servicenowEnabled: false,
  servicenowBaseUrl: 'http: //base-url.service-now.com',
  servicenowClientId: 'clientID',
  servicenowClientSecret: 'clientSecret'
}

我什至尝试添加 not required 而不是 else: true 但没有效果,我也尝试了几件事,但似乎没有任何效果。我只想让一个字段严格可用,否则基于其他一些布尔值

javascript json validation schema ajv
1个回答
0
投票

第 34 行的架构中有错误,

properties
未正确定义。

我为您修正了

if, then
语句。现在,您提供的示例已通过。

  • servicenowEnabled
    现在是
    required
    位于根模式,如果值为
    true
    ,则
    servicenowBaseUrl
    required

我还对

selectedList
required
属性以及满足
selectedList
条件时对
showAll: false
本身的要求添加了更多约束。

请检查并告诉我这是否适合您。

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "title": "Update app config Support & Ticketing",
  "type": "object",
  "properties": {
    "servicenowEnabled": {
      "type": "boolean"
    },
    "servicenowClientId": {
      "type": "string"
    },
    "servicenowClientSecret": {
      "type": "string"
    },
    "servicenowBaseUrl": {
      "type": "string",
      "format": "regex",
      "pattern": ".*service-now.com$"
    },
    "servicenowKnowledgeBaseEnabled": {
      "type": "boolean"
    },
    "servicenowKnowledgeBaseSelected": {
      "type": "object",
      "properties": {
        "showAll": {
          "type": "boolean"
        },
        "selectedList": {
          "type": "array",
          "items": {
            "type": "object",
            "required": ["id", "name"],
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1
              },
              "name": {
                "type": "string",
                "minLength": 1
              }
            }
          }
        }
      },
      "required": ["showAll"],
      "if": {
        "properties": {
          "showAll": {
            "const": false
          }
        }
      },
      "then": {
        "required": ["selectedList"],
        "properties": {
          "selectedList": {
            "minItems": 1
          }
        }
      }
    },
    "servicenowKnowledgeBaseName": {
      "type": "string",
      "minLength": 1
    },
    "servicenowKnowledgeBaseUrl": {
      "type": "string",
      "format": "uri"
    },
    "servicenowTicketsEnabled": {
      "type": "boolean"
    },
    "servicenowTicketsName": {
      "type": "string",
      "minLength": 1
    },
    "servicenowTicketsUrl": {
      "type": "string",
      "format": "uri"
    },
    "servicenowCreateTicketsEnabled": {
      "type": "boolean"
    },
    "servicenowNotificationEnabled": {
      "type": "boolean"
    }
  },
  "required": ["servicenowEnabled"],
  "allOf": [
    {
      "if": {
        "properties": {
          "servicenowEnabled": {
            "const": true
          }
        }
      },
      "then": {
        "required": ["servicenowBaseUrl"]
      }
    },
    {
      "if": {
        "required": ["servicenowKnowledgeBaseEnabled"],
        "properties": {
          "servicenowKnowledgeBaseEnabled": {
            "const": true
          }
        }
      },
      "then": {
        "required": [
          "servicenowKnowledgeBaseUrl",
          "servicenowKnowledgeBaseName",
          "servicenowKnowledgeBaseSelected"
        ]
      }
    }
  ],
  "additionalProperties": false
}

© www.soinside.com 2019 - 2024. All rights reserved.