Отчасти это относится к проверке данных, но я боюсь, если это можно сделать с помощью проверки схемы json, которая будет лучше соответствовать моим потребностям. Мой вход:Проверка схемы Json для двоичных логических операций дерева
(1 or (1 and 0)) => true
, которая становится объектом JSon:
[1, [1, 0]]
Так проверки не должны давать никаких ошибок, но в данный момент моя схема не может работать ИЛИ случае правильно между вложенными данными.
{
"allOf": [
{"$ref": "#/definitions/_items"},
{
"allOf": [
{"$ref": "#/definitions/_or"},
{
"items": {
"$ref": "#/definitions/_and"
}
}
]
}
],
"definitions": {
"_items": {
"minItems": 1,
"maxItems": 2,
"type": "array",
"items": {
"anyOf": [
{"enum": [1,0]},
{"$ref": "#/definitions/_items"}
]
}
},
"_or": {
"not": {
"type": "array",
"items": {
"not": {
"anyOf": [
{"enum": [1]},
{"$ref": "#/definitions/_items"}
]
}
}
}
},
"_and": {
"items": {
"anyOf": [
{"enum": [1]},
{"$ref": "#/definitions/_items"}
]
}
}
}
}
Пользователи следующие данные по схеме:
[1,0] is valid, ok
[1,1] is valid, ok
[0,1] is valid, ok
[0,0] not valid, ok
[[1,1],1] valid, ok
[[1,1],0] valid, ok
но:
[[1,0],1] not valid, not ok!
[[0,0],1] not valid, not ok!
, потому что оба имеют 1 на оператора ИЛИ, поэтому левая сторона не имеет значения, если только отвечает _items определение ,
Итак, мой вопрос заключается в том, как изменить схему так, чтобы anyOf на стороне оператора OR было достаточно для корректного ввода?
Больше примеров, запрошенных @esp:
Мои примеры ввода по логическому выражению и соответствующих данных в формате JSON:
1 or (1 and 0)) => [1, [1, 0]] => true
1 or (0 and 1)) => [1, [0, 1]] => true
1 or (1 and 1)) => [1, [0, 0]] => true
1 or (0 and 0)) => [1, [0, 0]] => true
1 or (1)) => [1, [1]] => true
1 or (0)) => [1, [0]] => true
1 or 1 => [1, 1 => true
1 or 0 => [1, 0] => true
0 or 1 => [0, 1] => true
0 or 0 => [0, 0] => false
Я даю также несколько вложенных примеров на левой стороне, но не все, потому что комбинации получают быстро дикие:
(1 and 0) or (1 and 0)) => [[1, 0], [1, 0]] => false
(0 and 0) or (0 and o)) => [[0, 0], [0, 0]] => false
(1 and 1) or (1 and 0)) => [[1, 1], [1, 0]] => true
(1 and 0) or (1 and 1)) => [[1, 0], [1, 1]] => true
(1 and 1) or (1 and 1)) => [[1, 1], [1, 1]] => true
Вы можете определить все возможные входы и ожидаемые выходы? Некоторые из ваших примеров не соответствуют шаблону x или (y и z). – esp
Также существует две проблемы: соответствует ли выражение шаблону и является ли оно истинным, поэтому вам, вероятно, нужны две схемы, а не одна, иначе как вы собираетесь различать не совпадающий шаблон и false? – esp
@esp: Добавлены примеры.Таким образом, вход может быть: [p] или [q] или [p, q] или [p, [q]] или [[p], q] или [[p], [q]] ', слева и справа сторона двоичного элемента может быть числом 1,0 или множеством, содержащим хотя бы один подобный элемент, но не более двух. Это уже должно быть сделано с определением _items. – MarkokraM