如何使用anyOf验证嵌套属性

时间:2017-11-16 17:59:39

标签: json jsonschema json-schema-validator

我正在努力使用json-schema编写验证规则。这是我的json格式的数据:

{
    "headers" : {
        "api_key" : "aaa-bbb-ccc-ddd-eee"
    },
    "query_string" : {
        "apikey" : "aaa-bbb-ccc-ddd-eee"
    }
}

我需要一条规则说:

  

至少" header-> api_key"或" query_string-> apikey"需要出现在json中,但不是两者都存在。

到目前为止,这是我的架构验证:

{
  "title": "Application Get Single",
  "type": "object",
  "properties": {
    "headers": {
      "type": "object",
      "properties": {
        "api_key": {
          "type": "string"
        }
      }
    },
    "query_string": {
      "type": "object",
      "properties": {
        "apikey": {
          "type": "string"
        }
      }
    }
  },
  "anyOf": [
    {"required": ["headers"["api_key"]]}, // what should this be??
    {"required": ["query_string"["apikey"]]} // what should this be??
  ]
}

我认为anyOf我正在寻找,但我不知道如何引用上面嵌套的json项目。

目前我收到错误:

  

JSON语法格式错误

我正在使用Justin Rainbow,因为我正在使用PHP。

2 个答案:

答案 0 :(得分:1)

有几种方法。最直截了当的是:

{
  "title": "Application Get Single",
  "type": "object",
  "properties": {
    "headers": {
      "type": "object",
      "properties": {
        "api_key": {
          "type": "string"
        }
      }
    },
    "query_string": {
      "type": "object",
      "properties": {
        "apikey": {
          "type": "string"
        }
      }
    }
  },
  "anyOf": [
    {
      "properties": {
        "headers": {
            "type": "object",
            "required":["api_key"]
        }
      }
    },
    {
      "properties": {
        "query_string": {
            "type": "object",
            "required":["apikey"]
        }
      }
    }
  ]
}

您可能还希望在根对象上使用"minProperties": 1,以确保存在标头或query_string。

编辑:重新阅读问题,如果headers.api_key和query_string.apikey是互斥的,请将anyOf更改为oneOf

答案 1 :(得分:1)

诀窍是“而不是其他”部分。这是我推荐的内容(假设草案06或更高版本,见下文草案04):

{
  "title": "Application Get Single",
  "type": "object",
  "properties": {
    "headers": {
      "type": "object",
      "properties": {
        "api_key": {
          "type": "string"
        }
      }
    },
    "query_string": {
      "type": "object",
      "properties": {
        "apikey": {
          "type": "string"
        }
      }
    }
  },
  "oneOf": [
    {
      "required": ["headers"],
      "query_string": false
    },
    {
      "required": ["query_string"],
      "headers": false
    }
  ]
}

对于draft-04,将false替换为{"not": {}},这意味着同样的事情,但是阅读起来很烦人。但是你不能在draft-04的大多数地方使用布尔模式,所以你需要用冗长的方式说“这个属性不能出现”。