【问题标题】:How to refer child attribute in required of parent level如何在父级别要求中引用子属性
【发布时间】:2021-02-15 09:17:10
【问题描述】:
{
   "$schema":"https://json-schema.org/draft/2019-09/schema",
   "$id":"PersonalDetails.json",
   "type":"object",
   "properties":{
      "Header":{
         "type":"object",
         "properties":{
            "HeaderName":{
               "type":"string"
            },
            "HeaderValue":{
               "type":"string"
            }
         }
      },
      "Details":{
         "type":"array",
         "items":{
            "type":"object",
            "properties":{
               "FName":{
                  "type":"string"
               },
               "LName":{
                  "type":"string"
               },
               "Address":{
                  "type":"object",
                  "properties":{
                     "FlatNo":{
                        "type":"string"
                     },
                     "Sector":{
                        "type":"string"
                     },
                     "LandMarks":{
                        "type":"object",
                        "properties":{
                           "LandMark1":{
                              "type":"string"
                           },
                           "LandMark2":{
                              "type":"string"
                           }
                        }
                     }
                  },
                  "required":[
                     "Sector"
                  ]
               }
            }
         }
      }
   }
}

示例数据:


    {
       "Header":{
          "HeaderName":"DummyName",
          "HeaderValue":"DummyName"
       },
       "Details":[
          {
             "FName":"Chicago",
             "LName":"Laos",
             "Address":{
                "FlatNo":"Excalibur",
                "Sector":"07",
                "LandMarks":{
                   "LandMark1":"USA",
                   "LandMark2":"UK"
                }
             }
          }
       ]
    }

这是我尝试过的方法

"allOf":[
   {
      "if":"properties":{
         "FlatNo":{
            "const":"07"
         },
         "LandMarks":{
            "properties":{
               "LandMark1":{
                  "const":"USA"
               }
            },
            "then":"LandMarks":{
               "required":[
                  "LandMark2"
               ]
            }
         }
      ]

所以要求是在 JSON Schema 中插入 IF then 条件,条件如下

如果 LandMark1 = USA 且 FlatNo = Excalibur,则需要 LandMark2 我无法弄清楚我应该将这个条件及其语法放在哪里

我在父级尝试了 LandMarks 的 if-then 条件,但不知何故,即使这样也不起作用。

任何帮助都是非常值得赞赏的

【问题讨论】:

  • 您能否向我们展示您尝试过但没有成功的方法?作为一个单独的模式是好的和可取的。应该可以帮你到这里没问题。除非我能确切地看到你尝试了什么,否则无法判断你做错了什么=]
  • 我尝试将 if-then 条件放在上述架构中地址级别的 allOf 标记中,但即使这种方法也不起作用
  • 我明白,但我还是想看看这是什么样子。请您编辑您的问题以包含此内容吗? =]
  • 您好 Relequestual,我已经编辑了问题,您可以看到我尝试过的方法
  • 谢谢。那里的 JSON 不太合适。看起来您的 ifthen 不是同一个对象的一部分。你想整理一下吗?

标签: json jsonschema


【解决方案1】:

我不完全确定您更新问题时使用的架构片段在哪里,但这里有一个基于该片段的完全固定的架构...

您必须将 properties 嵌套在 JSON 实例中树的最上层,您希望条件和生成的应用子模式具有上下文。

这是一个现场演示:https://jsonschema.dev/s/6VwCt

{
  "properties": {
    "Details": {
      "items": {
        "allOf": [
          {
            "if": {
              "properties": {
                "Address": {
                  "properties": {
                    "FlatNo": {
                      "const": "07"
                    },
                    "LandMarks": {
                      "properties": {
                        "LandMark1": {
                          "const": "USA"
                        }
                      }
                    }
                  }
                }
              }
            },
            "then": {
              "properties": {
                "Address": {
                  "properties": {
                    "LandMarks": {
                      "required": [
                        "LandMark2"
                      ]
                    }
                  }
                }
              }
            }
          }
        ]
      }
    }
  }
}

我假设在您的示例数据中,FlatNoSector 混淆了,所以我在现场演示实例中更正了这一点。

这是架构片段在Address 级别的样子...

{
  "properties": {
    "Address": {
      "allOf": [
        {
          "if": {
            "properties": {
              "FlatNo": {
                "const": "07"
              },
              "LandMarks": {
                "properties": {
                  "LandMark1": {
                    "const": "USA"
                  }
                }
              }
            }
          },
          "then": {
            "properties": {
              "LandMarks": {
                "required": [
                  "LandMark2"
                ]
              }
            }
          }
        }
      ]
    }
  }
}

【讨论】:

  • 有没有机会我们可以将这个 if-then 放在地址级别而不是放在 Details allOf 中
  • 当然可以。如果您在此过程中遇到困难,请告诉我。看来您只是没有考虑ifthen 的值是如何子模式的,所以您仍然需要使用properties
  • 牢记上述架构,我也尝试为地址级别编写它,但被卡住了。能否请您也提供地址级别的架构
  • 我已经更新了我的答案以反映这一点。我想你很接近! ifthen 的值本身就是 JSON Schema,因此您需要再次使用 properties 来定位对象的值。
  • 如果你有多个条件检查,你还需要做一些其他的事情,但是你没有在你的问题中表达出来。
猜你喜欢
  • 2011-11-06
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多