Схема JSON, которая проверяет, соответствует ли patternProperties одному из значений

Учитывая эту схему:

{
  "type": "object",
  "patternProperties": {
    "^(.*)$": {
      "type": "object",
      "patternProperties": {
        "^.*$": {
          "oneOf": [
            {
              "type": "string",
              "enum": ["Token1", "Token2", "Token3"]
            }
          ]
        }
      }
    }
  }
}

Я могу проверить такие данные:

{
  "myobject": {
    "prop1": "Token1",
    "prop2": "Token2",
    "prop3": "Token3"
  },
  "anotherobject": {
    "otherprop1": "Token1",
    "otherprop2": "Token3"
  }
}

т. е. каждое значение свойства в объекте верхнего уровня должно быть в перечислении ["Token1", "Token2", "Token3"]. Если я установлю Token4 в качестве значения, проверка не пройдет, как и ожидалось.

Можно ли сопоставить значение шаблона группы захвата ^(.*)$ и добавить еще одно правило под oneOf, которое подразумевает: ИЛИ значение находится в наборе имен объектов (верхнего уровня)? Чтобы успешно проверить что-то подобное:

{
  "myobject": {
    "prop1": "Token1",
    "prop2": "Token2",
    "prop3": "Token3"
  },
  "anotherobject": {
    "otherprop1": "myobject",    <- note this
    "otherprop2": "Token3"
  }
}

но терпит неудачу в

{
  "myobject": {
    "prop1": "Token1",
    "prop2": "Token2",
    "prop3": "Token3"
  },
  "anotherobject": {
    "otherprop1": "non-existing-object",    <- note this
    "otherprop2": "Token3"
  }
}

и предпочтительно/необязательно проверяет базовую рекурсию, чтобы также не выполнить этот ввод:

{
  "myobject": {
    "prop1": "Token1",
    "prop2": "Token2",
    "prop3": "Token3"
  },
  "anotherobject": {
    "otherprop1": "anotherobject",    <- note this
    "otherprop2": "Token3"
  }
}

person Annie    schedule 30.12.2017    source источник


Ответы (1)


Не со схемой JSON. Его областью является структурная проверка; такие правила, как вы описываете, могут быть реализованы в коде. Однако некоторые валидаторы позволяют использовать собственные ключевые слова.

Кстати, вы можете использовать ключевое слово AdditionalProperties, чтобы применить схему ко ВСЕМ свойствам.

person esp    schedule 30.12.2017
comment
Будет ли ужасно выходить за рамки схемы разрешить захват группы в patternProperties и позволить нам передать ее, например, через \1? - person Annie; 30.12.2017
comment
Кроме того, не могли бы вы показать код, как бы вы упростили данную схему, используя additionalProperties? - person Annie; 30.12.2017
comment
Это можно предложить организации JSON Schema, но я не думаю, что это будет принято. - person esp; 30.12.2017
comment
Когда ключевое слово «свойства» отсутствует, patternProperties:{'^.*$': schema} эквивалентно additionalProperties: schema - person esp; 30.12.2017