当所需的属性依赖于另一个属性的值时,使用 Json 模式

问题描述 投票:0回答:2

我可能会收到多种类型的请求。 有一个请求类型属性,其值可能为“添加”、“更新”、“删除”(例如)。

根据请求类型,我会得到不同的属性

如果请求类型是“add”,那么我将获得额外的属性“add-red”,“add-blue”,“foo”例如

如果请求类型为“update,”,则“update-xxx”、“update-yyy”、“update-xxx”

如果“删除”则“foo”,“bar”...

请注意,一些附加属性可能会出现多个请求类型(请参阅上例中的“foo”)

所以我想根据“请求类型”的值进行不同的验证。

我尝试过

"oneOf": [
  {
  ...
  "properties": { "request-type" : { "enum": ["add"] }
                  "add-red": { ...}
                }
  },
  {
  ...
  "properties": { "request-type" : { "enum": ["update"] }
                  "update-xxx": { ...}
                }
  }

希望验证器在决定选择哪个“oneOf”时能够匹配第一个值。

这似乎本身是“有效的”(因为 VS Code 验证器认为它是一个有效的模式),但没有执行我想要的操作 - 似乎当我编写相应的 JSON 时,它总是与第一个匹配,并且只接受“添加“作为其值)。

那么我该怎么做呢?我可以在这里定义 JSON 格式,所以我可以要求使用我可以以某种方式验证的东西。

这几乎与此重复:基于属性之一的 JSON 模式 anyOf 验证,但我认为答案需要为每种请求类型提供不同的附加属性集。

编辑:根据validation of json schemahaving oneOf keywords的答案 看来我的方法应该有效,所以也许这只是 MS VS Code 中智能感知的限制?

EDIT2:这提供了另一种方法:编写依赖于其他键的更复杂的 json 模式

我必须进行更多实验,也许最终会删除它!

json validation jsonschema
2个回答
1
投票

回答我自己的问题 - 问题的方法效果很好。 使用像 http://www.jsonschemavalidator.net/ 这样的验证器,我得到了我期望的行为。

只是 Visual Studio Code 的智能感知无法以某种方式解释它,这意味着它可以提供有用的指导(公平地说,这是一个困难的问题,因为它意味着部分匹配“oneOf”中的所有替代方案以查看哪些可能仍然有效)


0
投票

我有一个微妙的问题,其中一个属性名称依赖于另一个属性的值。该值不能放入枚举中,因为值集是无限的,唯一的限制(验证)是该值属于另一个属性。其他属性将定义诸如正则表达式、长度等验证。

这是我想要实现的有效 JSON:

{ "instrument_type":"汽车贷款", “汽车贷款”:{} }

我想要的验证是确保主体必须包含一个名称= $.instrument_type 处元素的值的对象

换句话说,验证规则应该是:

  1. “instrument_type”是必需的(并且需要符合某些约束
  2. 必须有一个名为“instrument_type”中的值的属性

有什么方法可以在 JSON Schema 中实现这一点吗?

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.