Почему `minLengh` не проверяет отсутствующее свойство в схеме JSON?

#json #jsonschema #json-schema-validator

#json #jsonschema #json-schema-validator

Вопрос:

Я пытаюсь проверить схему json для моего объекта. Но если else не выполняется для моего объекта. Итак, здесь, в этом примере, я хочу проверить, есть ли описание продажи, когда служба продажи ‘Y’ (обратите внимание, я хочу выполнить if else для объекта внутри объекта), потому что планирование продаж находится внутри объекта продажи.

   "Sale":{
   "type":"object",
   "properties":{
      "SaleScheduling":{
         "type":"object",
         "properties":{
            "SaleDescription":{
               "type":"string"
            },
            "SaleService":{
               "type":"string",
               "minLength":1,
               "enum":[
                  "Y",
                  "N"
               ]
            }
         },
         "if":{
            "properties":{
               "SaleService":{
                  "const":"Y"  //if this is Y, SaleDescription should be present
               }
            }
         },
         "then":{
            "properties":{
               "SaleDescription":{
                  "minLength":1
               }
            }
         },
         "else":{
            "properties":{
               "SaleDescription":{
                  
               }
            }
         },
         "required":[
            "SaleService"
         ]
      }
   },
   "required":[
      "SaleScheduling"
   ]
}
  

Ответ №1:

Чтобы сделать свойство обязательным с помощью схемы JSON, вам необходимо использовать required ключевое слово. Ваша подсхема в else

 {
  "properties":{
    "SaleDescription":{
      "minLength":1
    }
}
  

Это будет применяться только minLength в том случае, если свойство SalesDescription существует. Если оно не существует, это не вызовет ошибки. Вот как работает применимость в схеме JSON. properties применяет подсхемы к объекту на основе ключей. { "minLength": 1 } сама по себе является подсхемой, которая применяется к местоположению в экземпляре.

Это пример проблемы X / Y. Ваш if/then работает правильно, но then подсхема не выполняет то, что вы ожидаете.

Комментарии:

1. Чтобы помочь отладке схемы JSON, вы можете установить для любой false подсхемы значение, чтобы увидеть, используется ли эта подсхема или нет. false приведет к сбою проверки, но подсхема должна быть применена.

2. Не могли бы вы предоставить дополнительную информацию о том, как установить для subschema значение false и как его отладить. — Повторный вопрос

3. Например, "properties": { "SaleDescription": false } это будет означать, что любое значение SaleDescription приведет к сбою проверки. Живая демонстрация: jsonschema.dev / s/ v8erZ

4. Или даже "then": false . true и false являются допустимыми значениями схемы! =]

5. Можем ли мы применить условие if else на основе значений извне объекта?