首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >模式验证,如何根据下层条件强制顶层属性的存在

模式验证,如何根据下层条件强制顶层属性的存在
EN

Stack Overflow用户
提问于 2019-04-25 03:06:44
回答 2查看 166关注 0票数 2

我正在尝试编写一个模式,以便在将yaml文件解析为JSON之后对其进行验证。

假设这是我的.yml文件,包含两个顶级属性:汽车和车库。

汽车是可选的,而车库是必需的。

然而,garage的一个子属性是汽车。如果定义了garage下的cars,我希望模式确保顶层的cars也被定义。否则,该模式将无效

代码语言:javascript
复制
cars:
  - BMW
  - Mercedes-Benz
  - Audi

garage:
  location: Miami
  cars:
    - BMW
    - Audi

我的架构:

代码语言:javascript
复制
{
  properties: {
    cars: {
       type: 'array',
       items: {
          type: 'string'
       }
     },
    garage: {
      type: 'object',
      properties: {
          location: {
            type: 'string'
           },
          cars: {
            type: 'array'
         }
    },
 required: ['garage']
}}

所以我试着在顶层做一个if-else

代码语言:javascript
复制
{
  if: { properties: { garage: { cars: {type: 'array'}}}},
  then: {required:['cars']},
  properties: {
    cars: {
       type: 'array',
       items: {
          type: 'string'
       }
     },
    garage: {
      type: 'object',
      properties: {
          location: {
            type: 'string'
           },
          cars: {
            type: 'array'
         }
    },
 required: ['garage']
}}

但似乎我做错了,或者它没有达到这个目的。

另外,在顶层执行anyOf来匹配子模式对我来说也不起作用。

有什么帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-27 17:10:27

您可以使用"JSON扩展结构模式“语言JESS指定引用完整性约束(以及所有其他要求)。

下面是作为单个JSON文档呈现的完整JESS模式:

代码语言:javascript
复制
[ "&",
  ["&",
    {"::>=": {"garage": {"location": "string", "cars": [ "string" ] } } }
  ],
  {"ifcond": { "has": "cars" },
    "then": ["&", { "forall": ".[cars]", "schema": ["string"]  } ]
  },
  {"setof": ".[garage]|.[cars][]", "subsetof": ".[cars][]"}
]

第一个"&“介绍了三个要求的结合,最后一个是参照完整性约束。

JESS repository有一个模式一致性检查器,我用它来验证您的样本(表示为JSON)是否符合上面的模式。

票数 1
EN

Stack Overflow用户

发布于 2019-04-25 05:50:47

if的值必须是JSON Schema。如果将if的值作为它自己的JSON Schema,并测试将其应用到JSON实例中正确位置的验证结果,可能会帮助您调试这类问题。

if块中,需要将嵌套cars放在properties下,就像在主模式中所做的那样。

您可能还想在您的if模块中同时制造所需的车库和汽车。]

但是,您不能定义希望将来自garage.cars的值包含在cars数组中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55836982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档