Схема JSON условно требуется от вложенного объекта - PullRequest
0 голосов
/ 20 февраля 2019

В схеме JSON я пытаюсь выполнить условную проверку на основе значения во вложенном объекте.Моя схема и образец JSON приведены ниже.На простом английском языке мое правило будет таким: «если bar.sub2 равен 'cat', то требуется baz".

Мой образец JSON проходит проверку и должен потерпеть неудачу, потому что baz не работает.Я достаточно уверен, что условная логика верна и что указатель на bar.sub2 неверен.Но я не могу понять синтаксис и структуру того, как сделать это правильно.

Пример JSON

    {"foo": "someValue"
     ,"bar": {"sub1":"someValue", "sub2": "cat"}
    }

Схема:

    {
    "$schema": "http://json-schema.org/draft-07/schema#",
    "type": "object",
    "properties": {
        "foo": { "type": "string"}
        ,"bar" : {
            "type": "object"
            ,"properties": {
                "sub1": { "type": "string"}
                ,"sub2": { "type": "string"}
            },
            "required" :["sub1","sub2"]
        }
        ,"baz":{"type": "string"}

  },

  "oneOf":[
    {"properties": {"not": {"/bar/sub2": { "enum": ["cat"]}}}}
    ,{"required" : ["baz"]}
  ],


  "required": ["foo","bar"],

  "definitions":{}

}

РЕДАКТИРОВАТЬ: нашел свой собственный ответ здесь

Правильная схема:

"oneOf":[
    {"not" : {"$ref": "#/definitions/sub2IsCat"}}
    ,{"required" : ["baz"]}
  ],

  "definitions":{
    "sub2IsCat" :{
        "properties":{ 
            "bar": {
              "properties":{
                   "sub2" :{ "enum": ["cat"] }}}}}

  }
...