if then else в схеме json - PullRequest
0 голосов
/ 29 мая 2020
{
"$schema": "http://json-schema.org/draft-07/schema",
"$id": "http://example.com/example.json",
"type": "object",
"required": [
    "FileID",
    "MString",
    "desc",
    "elements"
],
"properties": {
    "FileID": {
        "type": "string"
    },
    "MString": {
        "type": "string"
    },
    "desc": {
        "type": "string"
    },
    "elements": {
        "type": "array",
        "items": {
            "type": "object",
            "required": [
                "Mytype",
                "filename",
                "compression"
            ],
            "properties": {
                "Mytype": {
                    "type": "string"
                },
                "filename": {
                    "type": "string"
                },
                "compression": {
                    "type": "string"
                }
            }
        }
    }
}

}

Я хочу добавить условие в эту схему (если Mytype == "ab c"), тогда "filename" может быть только "tutor.txt". Пожалуйста, помогите мне написать это и добавить это условие в схему. Я пробовал много способов, но всегда давал ошибки. Заранее спасибо.

1 Ответ

0 голосов
/ 31 мая 2020

Существуют разные подходы к достижению такого поведения. Один из них использует условные аппликаторы на месте, которые доступны с JSON Schema Draft 7. Синтаксис выглядит следующим образом (для ясности я извлечу задействованную подсхему):

{
  "type": "object",
  "required": [
    "Mytype",
    "filename",
    "compression"
  ],
  "properties": {
    "Mytype": {
      "type": "string"
    },
    "filename": {
      "type": "string"
    },
    "compression": {
      "type": "string"
    }
  },
  "if": {
    "properties": {"Mytype": {"const": "abc"}}
  },
  "then": {
    "properties": {"filename": {"const": "tutor.txt"}}
  }
}

Следующее JSON документ действителен для этой JSON Схема:

{
  "Mytype": "abc",
  "filename": "tutor.txt",
  "compression": "foo"
}

И это будет недействительно :

{
  "Mytype": "abc",
  "filename": "tutor",
  "compression": "foo"
}

Для более сложных условий JSON Схема предоставляет ключевое слово "else". Чтобы узнать больше, я предлагаю вам проверить этот учебный справочник в разделе Условное применение подсхем .

В дополнение к этому условному подходу вы можете express та же самая грамматика с использованием аппликаторов логических логических c вместо условных аппликаторов, показанных выше. Лично я, хотя обычно более подробный, я предпочитаю это решение, поскольку оно представляет собой чисто декларативное решение вместо этого «процедурного» * ​​1019 * понятия, которое в конце концов остается более ясным.

Вот пример:

{
  "type": "object",
  "required": [
    "Mytype",
    "filename",
    "compression"
  ],
  "oneOf": [
    {
      "properties": {
        "Mytype": {
          "const": "abc"
        },
        "filename": {
          "const": "tutor.txt"
        },
        "compression": {
          "type": "string"
        }
      }
    },
    {
      "properties": {
        "Mytype": {
          "not": {
            "const": "abc"
          }
        },
        "filename": {
          "type": "string"
        },
        "compression": {
          "type": "string"
        }
      }
    }
  ]
}

Пояснение: документ JSON должен быть действителен для только одной из подсхем, включенных в "oneOf". Первый выражает ограниченный регистр, обязывающий "filename" быть "tutor.txt", если "Mytype" равно "abc". Вторая подсхема представляет случай, когда "Mytype" равно , а не "abc", поэтому "filename" не ограничивается, просто любое "string".

Как указано, логическое логическое значение Синтаксис c аппликаторов дает более подробные схемы, и им может потребоваться некоторое время, чтобы привыкнуть к ним, но в целом, на мой взгляд, они являются лучшим вариантом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...