Пожалуйста, не стесняйтесь обновлять название заголовка для этого вопроса.
Я пытаюсь достичь чего-то вроде этого . Входной JSON / данные JSON должны иметь OWNER и учетную запись CHARGE_TO, но они не обязательно должны быть в одной учетной записи (т. Е. Одна учетная запись может быть OWNER, другая может быть CHARGE_TO) и не должна содержать учетную запись с какими-либо другими ролями.
ПРИМЕЧАНИЕ: Необходимо определить схему JSON, которая должна быть простой в обслуживании. Т.е. должно быть легко добавить новую роль в условие. Мои действительные и недействительные JSON:
*************************** VALID JSON1 *********************************
{
"user": [
{
"name": "user1",
"roles": ["OWNER"]
},
{
"name": "user2",
"roles": ["ANY_OTHER_ROLE"]
},
{
"name": "user3",
"roles": ["CHARGE_TO"]
}]
}
*************************** VALID JSON2 *********************************
{
"user": [
{
"name": "user1",
"roles": ["OWNER", "CHARGE_TO"]
},
{
"name": "user2",
"roles": ["ANY_OTHER_ROLE"]
}]
}
*************************** INVALID JSON *********************************
{
"user": [
{
"name": "user1",
"roles": ["OWNER"]
},
{
"name": "user2",
"roles": ["ANY_OTHER_ROLE"]
}]
}
JSON действителен, если у него есть пользователь с ролями ( "OWNER" и "CHARGE_TO" ) или если пользователи с ролями ( user1 - "OWNER", user3- "CHARGE_TO", другие пользователи с любой другой ролью ).
Ниже приведена схема JSON, которую я пробовал (draft_07). ЭТО НЕ РАБОЧАЯ СХЕМА .
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Complex inner array",
"type": "object",
"properties": {
"user": {
"type": "array",
"contains": {
"type": "object",
"properties": {
"name": { "type": "string" },
"orderRoles": {
"type": "array",
"minItems": 1,
"items": { "type": "string" }
}
},
"oneOf": [
{ "properties": { "roles": { "enum": ["OWNER", "CHARGE_TO"] }}},
{ "properties": { "roles": { "enum": ["OWNER"] }}},
{ "properties": { "roles": { "enum": ["CHARGE_TO"] }}}
]
},
"items": {
"type": "object",
"properties": {
"name": { "type": "string" },
"orderRoles": {
"type": "array",
"minItems": 1,
"items": { "type": "string" }
}
}
}
}
}
}