有没有一种方法可以让我使用JSON SCHEMA为我的属性按值声明一个依赖关系?

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

假设我们有一个简单的对象,如

{ "key_1": "value_1", "key_2": "value_2"}

有什么办法可以让我的json模式根据键间依赖关系的值来制作,这样就不允许重复使用 value_1key_2? 我使用的是json schema draft-4。

不允许。

{ "key_1": "value_1", "key_2": "value_1"}

json jsonschema
1个回答
0
投票

首先:如果键和值都是未知的,这属于 "业务逻辑 "范畴,不在JSON模式规范的范围内,需要独立处理。


根据你的评论,值的数量是有限的(我假设键的数量也是有限的)。这意味着你有几个选择--即使在草案4中。

1. 使用 anyOf 以确保除了一个键之外,所有的键都没有特定的值,最后用 allOf (对每个数值)。

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "key_1": { "type": "string" },
    "key_2": { "type": "string" },
    "key_3": { "type": "string" }
  },
  "allOf": [
    {
      "anyOf": [
        {
          "properties":{
            "key_1": { "not": { "enum": ["value_1"] } },
            "key_2": { "not": { "enum": ["value_1"] } }
          }
        },
        {
          "properties":{
            "key_1": { "not": { "enum": ["value_1"] } },
            "key_3": { "not": { "enum": ["value_1"] } }
          }
        },
        {
          "properties":{
            "key_2": { "not": { "enum": ["value_1"] } },
            "key_3": { "not": { "enum": ["value_1"] } }
          }
        }
      ]
    },
    {
      "anyOf": [
        {
          "properties":{
            "key_1": { "not": { "enum": ["value_2"] } },
            "key_2": { "not": { "enum": ["value_2"] } }
          }
        },
        {
          "properties":{
            "key_1": { "not": { "enum": ["value_2"] } },
            "key_3": { "not": { "enum": ["value_2"] } }
          }
        },
        {
          "properties":{
            "key_2": { "not": { "enum": ["value_2"] } },
            "key_3": { "not": { "enum": ["value_2"] } }
          }
        }
      ]
    }
  ]
}

2. 使用 oneOf 来表示要么没有,要么只有一个键有一个特定的值。对每一个可能的值都这样做,最后将其包裹在 allOf.

小心 required 关键字,以确保相应的键确实存在。

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "key_1": { "type": "string" },
    "key_2": { "type": "string" },
    "key_3": { "type": "string" }
  },
  "allOf": [
    {
      "oneOf": [
        {
          "properties": {
            "key_1": { "not": { "enum": ["value_1"] } },
            "key_2": { "not": { "enum": ["value_1"] } },
            "key_3": { "not": { "enum": ["value_1"] } }
          }
        },
        {
          "properties": {
            "key_1": { "enum": ["value_1"] }
          },
          "required": ["key_1"]
        },
        {
          "properties": {
            "key_2": { "enum": ["value_1"] }
          },
          "required": ["key_2"]
        },
        {
          "properties": {
            "key_3": { "enum": ["value_1"] }
          },
          "required": ["key_3"]
        }
      ]
    },
    {
      "oneOf": [
        {
          "properties": {
            "key_1": { "not": { "enum": ["value_2"] } },
            "key_2": { "not": { "enum": ["value_2"] } },
            "key_3": { "not": { "enum": ["value_2"] } }
          }
        },
        {
          "properties": {
            "key_1": { "enum": ["value_2"] }
          },
          "required": ["key_1"]
        },
        {
          "properties": {
            "key_2": { "enum": ["value_2"] }
          },
          "required": ["key_2"]
        },
        {
          "properties": {
            "key_3": { "enum": ["value_2"] }
          },
          "required": ["key_3"]
        }
      ]
    }
  ]
}

可能还有一些更多的组合,例如,列出所有允许的值组合,但你明白了:对于一些键和值来说,这是可以管理的,但很快就会变得笨重--假设你必须手动维护这个。

© www.soinside.com 2019 - 2024. All rights reserved.