根据键值取反创建Json模式依赖关系

时间:2018-12-10 07:52:03

标签: json jsonschema

{
      "eventType": "memory_exceeded",
      "event_time": 1544423819843,
      "clientDetails": {},
      "appDetails": {},
      "DeviceDetails": {}
    }

我正在尝试在上述json结构中提供具有以下条件的json模式。

1)有一个键“ eventType”,可以有1000多个值。

2)还有4个其他依赖属性以及event_type。

3)我想在其中编写模式定义

  

a)如果“ eventType”!= [“ x”,“ y”,“ z”],则包括所有这4个   依赖属性。

     

b)如果“ eventType” = [“ x”,“ y”,“ z”],则仅包含   “ DeviceDetails”作为依赖项。

我可以为此使用OneOf吗?我知道我们可以在3a中使用“ not”键进行否定检查。但是我无法参与其中。请帮助指针。

1 个答案:

答案 0 :(得分:1)

如果通过“然后包括所有4个从属属性” 的意思是使它们成为必需的属性,那么我可以想到这种基于草案07的解决方案:

如果eventType设置为“ x”,“ y”或“ z”,则仅DeviceDetails是必需的。否则,其他一切都是。 (我会让您自己替换这些占位符值:)

我冒昧地将minProperties: 1设置为DeviceDetailsappDetailsClientDetails,因为我认为您更喜欢使用非空对象。如果不需要,您可以安全地从架构中删除它。

{
  "properties": {
    "eventType": {
      "type": "string"
    },
    "event_time": {
      "type": "integer"
    },
    "ClientDetails": {
      "type": "object",
      "minProperties": 1
    },
    "appDetails": {
      "type": "object",
      "minProperties": 1
    },
    "DeviceDetails": {
      "type": "object",
      "minProperties": 1
    }
  },
  "if": {
    "properties": {
      "eventType": {
        "enum": [
          "x",
          "y",
          "z"
        ]
      }
    }
  },
  "then": {
    "required": [
      "DeviceDetails"
    ]
  },
  "else": {
    "required": [
      "event_time",
      "ClientDetails",
      "appDetails",
      "DeviceDetails"
    ]
  }
}