如果另一个对象在JSON模式中具有属性,则指定对象应为空

如果另一个对象在JSON模式中具有属性,则指定对象应为空,json,jsonschema,json-schema-validator,ajv,Json,Jsonschema,Json Schema Validator,Ajv,我有从GraphQL返回的数据,我想在操作它之前用JSON模式验证该数据 在graphQL中可能有比我现在更好的方法来实现这一点,但是返回的数据可以是两种具有相同属性的类型: e、 g.数据的简化版本 obj: { audio: { artists: [] }, video: {} } 或 因此,有效性将是: 同时具有音频和视频属性的对象 具有音频的对象,作为具有属性艺术家和空属性视频对象的对象 具有video的对象,作为具有属性artists和空属性audio对象的对象

我有从GraphQL返回的数据,我想在操作它之前用JSON模式验证该数据

在graphQL中可能有比我现在更好的方法来实现这一点,但是返回的数据可以是两种具有相同属性的类型:

e、 g.数据的简化版本

obj: {
  audio: {
    artists: []
  },
  video: {}
}

因此,有效性将是:

  • 同时具有
    音频
    视频
    属性的对象
  • 具有
    音频
    的对象,作为具有属性
    艺术家
    和空属性
    视频
    对象的对象
  • 具有
    video
    的对象,作为具有属性
    artists
    和空属性
    audio
    对象的对象
  • 音频
    视频
    都不应同时为空
  • 音频
    视频
    都不应同时具有属性
我构建了一个简化的模式,如下所示:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "file://schemas/simple.schema.json",
  "title": "simplified data",
  "description": "simple",
  "type": "object",
  "properties": {
    "audio": {
      "type": "object"
    },
    "video": {
      "type": "object"
    }
  },
  "oneOf": [
    {
      "audio": {
        "type": "object",
        "properties": {
          "artists": {
            "type": "array"
          }
        }
      },
      "video": {
        "type": "object",
        "properties": {}
      }
    },
    {
      "audio": {
        "type": "object",
        "properties": {}
      },
      "video": {
        "type": "object",
        "properties": {
          "artists": {
            "type": "array"
          }
        }
      }
    }
  ]
}
但AJV在以下情况下运行时似乎无法正确验证数据:

{
  "audio": {
    "artists": []
  },
  "video": {}
}

我的模式可能出了什么问题?

经过初步尝试,Jason指出了一个更简单的解决方案

使用中的一个,您可以指定只有一个对象可以具有至少一个属性

您可以在此处进行测试:


经过初步尝试,Jason指出了一个更简单的解决方案

使用中的一个,您可以指定只有一个对象可以具有至少一个属性

您可以在此处进行测试:


如果
/
则不需要
s。其中的
就足够了。另外,
“not”:{“additionalProperties”:false}
可以简化为
“minProperties”:1
。是的,实际上你是对的。我在模式的其他部分之后添加了
oneOf
。我将更新答案以反映情况。谢谢。
如果
/
则不需要
s。其中的
就足够了。另外,
“not”:{“additionalProperties”:false}
可以简化为
“minProperties”:1
。是的,实际上你是对的。我在模式的其他部分之后添加了
oneOf
。我将更新答案以反映情况。谢谢
{
  "audio": {
    "artists": []
  },
  "video": {}
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "file://schemas/simple.schema.json",
  "properties": {
    "audio": {
      "type": [
        "object"
      ],
      "properties": {
        "artists": {
          "$comment": "whatever validation you want"
        }
      }
    },
    "video": {
      "type": [
        "object"
      ],
      "properties": {
        "artists": {
          "$comment": "whatever validation you want"
        }
      }
    }
  },
  "oneOf": [
    {
      "properties": {
        "video": {
          "minProperties": 1
        }
      }
    },
    {
      "properties": {
        "audio": {
          "minProperties": 1
        }
      }
    }
  ]
}