基于json模式中的枚举值的双向绑定依赖

时间:2020-01-29 09:21:31

标签: javascript json jsonschema json-schema-validator

我必须要验证以下json数据的架构。

addEventListener('fetch', event => { event.respondWith(handleRequest(event.request)) }) /** * Respond to the request * @param {Request} request */ async function handleRequest(request) { country_code = request.headers.get('CF-IPCountry'); var link; let userAgent = request.headers.get('User-Agent') || '' if (userAgent.includes('Googlebot')) { return new Response('', { status: 301, headers: { 'Location': "https://www.website.com/" } }) } switch(request.headers.get('CF-IPCountry')) { case 'TW': // Taiwan link = "https://www.website.com/twn"; break; case 'TH': // Thailand link = "https://www.website.com/tha"; break; case 'GB': // United Kingdom link = "https://www.website.com/gbr"; break; case 'US': // United States link = "https://www.website.com/us"; break; default: link = "https://www.website.com/rotw" // Rest of the world } return new Response('', { status: 301, headers: { 'Location': link } }) }

有关JSON的信息{ 'userId': 123, 'userType': CUSTOMER }是整数,而userId是枚举userType
所以问题是我想基于:

从JSON模式验证JSON数据。
  1. 如果存在['Customer','Admin','Guest'],则需要userId
  2. 如果存在userType userType但不存在userId,则它不应验证JSON数据。
  3. 但是,如果['Customer','Admin']userType,则需要他们的userId。

这里我已经达到了第1点,但无法达到第2点和第3点:

['Guest']

有人可以为此建议我json模式解决方案吗?

1 个答案:

答案 0 :(得分:2)

我认为您可以使用json模式的属性anyOf来解决它,可以添加多个模式以验证userTypeCustomer还是Admin强制一个模式,如果用户类型为Guest,请强制另一个,例如:

{
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "user": {
          "type": "integer",
          "minimum": 0
        },
        "userType": {
          "type": "string",
          "enum": [
            "Customer",
            "Admin"
          ]
        }
      }
    },
    {
      "type": "object",
      "properties": {
        "user": {
          "type": "integer",
          "minimum": 0
        },
        "userType": {
          "type": "string",
          "enum": [
            "Guest"
          ]
        },
        "userId": {
          "type": "string"
        }
      }
    }
  ]
}