Добавление ссылочного пути к обязательному в if / then [json]

#json #jsonschema

#json #jsonschema

Вопрос:

Пожалуйста, мне нужна помощь, у меня есть большой файл, который мне нужен для проверки некоторых данных. Для полей с теми же свойствами это работает с использованием приведенного ниже кода. Но у меня также есть поля, которые не находятся под теми же «свойствами».

 "if": {
  "properties": {
    "type": { "const": "one" }
  }
   },
"then": { "required": ["test"] } }
  

Итак, что я делаю, так это добавляю ссылочный путь к требуемому оператору. Я пробовал это

 "then": { "required": {"$ref" : "#/path/example" }}
  

но это не сработало. Есть идеи, могу ли я использовать ссылочный путь внутри required и если да, то как?

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

1. Пожалуйста, прочитайте json-schema.org/understanding-json-schema/reference /… .

2. Я сделал и я понимаю структуру json, но я не мог найти решение для этого. Я предполагаю, что это допустимо, но я не знаю, почему это не работает (кстати, я оборачиваю это внутри allOf)

3. Вы можете использовать только $ref там, где ожидается схема. required ожидает массив строк, поэтому $ref не допускается. Я не понимаю, что вы пытаетесь сделать. Если вы отредактируете свой вопрос с более подробной информацией, тогда я, возможно, смогу предложить альтернативную схему, в которой вам не нужна $ref .

4. Моя проблема в том, что требуемое поле не соответствует тому же пути свойств «type», так как я могу сослаться на него в required поле (мне нужно указать его путь, но, как вы сказали, я не могу использовать ref внутри required). Достаточно ли я объяснил свою проблему?

5. В приведенном выше примере «тип» и «тест» находятся под одними и теми же «свойствами», но что, если я хочу, чтобы поле в #path / example было обязательным, как указать его путь внутри required. Я ценю любую помощь

Ответ №1:

Я думаю, что вы пытаетесь выразить то, что если /type есть "one" , то /path/example требуется.

Итак, они должны быть допустимыми:

 {
  "type": "one",
  "path": { "example": 42 }
}
  
 {
  "type": "two",
  "path": { "foo": 42 }
}
  

И это не должно быть допустимым:

 {
  "type": "one",
  "path": { "foo": 42 }
}
  

Вот как мы можем это сделать:

 "if": {
  "properties": {
    "type": { "const": "one" }
  }
},
"then": {
  "properties": {
    "path": { "required": ["example"] }
  },
  "required": ["path"]
}
  

Вам нужно установить путь с помощью properties (возможно, нескольких вложенных properties , если вам нужно пройти более двух уровней) и использовать required на каждом уровне.

(Если я все еще не понимаю ваш вопрос, дайте мне знать, и мы сможем попробовать еще раз)