我正在努力使用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。
答案 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的大多数地方使用布尔模式,所以你需要用冗长的方式说“这个属性不能出现”。