Могут ли ключевые слова «если, тогда и еще» применяться в свойствах объекта или они строго хранятся вне? - PullRequest
0 голосов
/ 30 марта 2019

https://json -schema.org / понимание-JSON-схема / ссылки / conditionals.html Все примеры, упомянутые в URL, имеют условия if, then и else вне свойств объекта. Мне было просто интересно узнать, можно ли его установить в свойствах и при этом соответствовать стандартам?

{
  "type": "object",
  "properties": {
    "street_address": {
      "type": "string"
    },
    "country": {
      "enum": ["United States of America", "Canada"]
    }
  },
  "if": {
    "properties": { "country": { "const": "United States of America" } }
  },
  "then": {
    "properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }
  },
  "else": {
    "properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }
  }
}

Можно ли это сделать таким образом?

{
  "type": "object",
  "properties": {
    "street_address": {
      "type": "string"
    },
    "country": {
      "enum": ["United States of America", "Canada"]
    },
    "if": {
      "properties": { "country": { "const": "United States of America" } }
    },
    "then": {
      "properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }
    },
    "else": {
     "properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }
    }
  }
}

Я попробовал в оперативном режиме JSON-схему, и она не вызвала никаких ошибок, однако я не знаю о ее реализации, поэтому не очень уверен, соответствует ли синтаксис предлагаемому проекту-7 или нет.

Мотивация сделать это в свойствах объекта: Особенно в большом файле схемы, было бы лучше, если бы я мог определить атрибут, значение которого условно зависит от некоторых других свойств прямо рядом с ним. Вместо того, чтобы сначала закончить все свойства, затем применить условия отдельно от свойств.

Очень плохо знаком с программированием - извините, если это очень неправильный вопрос. Спасибо.

1 Ответ

1 голос
/ 31 марта 2019

Все ключевые слова, в том числе if / then / else, могут появляться во всем, что является схемой .Значение ключевого слова properties определяется как объект , значения которого являются схемами.Поэтому ключевые слова нельзя использовать в качестве дочернего элемента properties, но их можно использовать в одном из его значений.

Если вы сделаете что-то подобное ...

{
  "type": "object",
  "properties": {
    "street_address": { "type": "string" },
    "country": { "enum": ["United States of America", "Canada"] },
    "if": {
      "properties": { "country": { "const": "United States of America" } }
    },
    "then": {
      "properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }
    },
    "else": {
     "properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }
    }
  }
}

itописывает объект как ...

{
  "street_address": "123 Fake St",
  "country": "United States of America",
  "if": { "country": "United States of America" },
  "then": { "postal_code": "90000" },
  "else": { "postal_code": "A0A 0A0" }
}

Обратите внимание, что «если», «тогда», «еще» понимаются как имена свойств, а не как ключевые слова.Опять же, это потому, что значение properties не является схемой, это объект, значения которого являются схемами.Эта схема оказывается действительной схемой, она просто не делает того, чего вы ожидаете.

Поэтому вы можете сделать что-то вроде этого ...

{
  "type": "object",
  "properties": {
    "street_address": { "type": "string" },
    "country": { "enum": ["United States of America", "Canada"] },
    "postal_code": {
      "if": { ... },
      "then": { ... },
      "else": { ... }
    }
  }
}

В этом случае, он распознает if / then / else в качестве ключевых слов, но не существует способа написать это условие для выполнения того, что вы пытаетесь сделать.Вы должны поместить его на верхний уровень, как это сделали примеры, которые вы видели.

...