JSON 模式 "oneOf" 用于验证键的存在
JSON schema "oneOf" for validating existence of keys
我正在尝试创建一个 JSON 模式来验证多个不同的实体,这些实体具有大部分相同的属性,但只有少数属性不同。
{
"firstname": "Bat",
"lastname": "man",
"email": "batman@gmail.com"
}
{
"firstname": "Super",
"lastname": "man",
"phone": "543-453-4523"
}
{
"firstname": "Wonderwo",
"lastname": "man",
"email": "wonderwoman@gmail.com"
}
基本上我想创建一个单一模式,确保姓氏是 "man"
并且具有 phone
或 email
属性。
我尝试使用 oneOf
来实现它,如下所示:
{
"properties": {
"firstname": {
"type": "string"
},
"lastname": {
"type": "string",
"pattern": "man"
},
"oneOf": [{
"email": {
"type": "string"
},
"phone": {
"type": "string"
}
}]
}
}
但我认为这行不通。使用 JSON 模式甚至可以实现这样的事情吗?我怎样才能做到这一点?
你有几个问题:
- "oneOf"是关键字,不能在属性里面使用。
- "oneOf"里面的项目应该是模式,你那里有的不是。
- "anyOf" 几乎总是比 "oneOf" 好,除非你真的需要独家 "OR"
- "pattern" 是一个错误的关键字,你需要 "enum" (或 draft-06 "const")
你需要:
{
"type": "object",
"required": ["firstname", "lastname"],
"properties": {
"firstname": {
"type": "string"
},
"lastname": {
"type": "string",
"enum": ["man"]
},
"email": {
"type": "string"
},
"phone": {
"type": "string"
}
},
"anyOf": [
{ "required": ["email"] },
{ "required": ["phone"] }
]
}
我正在尝试创建一个 JSON 模式来验证多个不同的实体,这些实体具有大部分相同的属性,但只有少数属性不同。
{
"firstname": "Bat",
"lastname": "man",
"email": "batman@gmail.com"
}
{
"firstname": "Super",
"lastname": "man",
"phone": "543-453-4523"
}
{
"firstname": "Wonderwo",
"lastname": "man",
"email": "wonderwoman@gmail.com"
}
基本上我想创建一个单一模式,确保姓氏是 "man"
并且具有 phone
或 email
属性。
我尝试使用 oneOf
来实现它,如下所示:
{
"properties": {
"firstname": {
"type": "string"
},
"lastname": {
"type": "string",
"pattern": "man"
},
"oneOf": [{
"email": {
"type": "string"
},
"phone": {
"type": "string"
}
}]
}
}
但我认为这行不通。使用 JSON 模式甚至可以实现这样的事情吗?我怎样才能做到这一点?
你有几个问题:
- "oneOf"是关键字,不能在属性里面使用。
- "oneOf"里面的项目应该是模式,你那里有的不是。
- "anyOf" 几乎总是比 "oneOf" 好,除非你真的需要独家 "OR"
- "pattern" 是一个错误的关键字,你需要 "enum" (或 draft-06 "const")
你需要:
{
"type": "object",
"required": ["firstname", "lastname"],
"properties": {
"firstname": {
"type": "string"
},
"lastname": {
"type": "string",
"enum": ["man"]
},
"email": {
"type": "string"
},
"phone": {
"type": "string"
}
},
"anyOf": [
{ "required": ["email"] },
{ "required": ["phone"] }
]
}