如果另一个对象在JSON模式中具有属性,则指定对象应为空
我有从GraphQL返回的数据,我想在操作它之前用JSON模式验证该数据 在graphQL中可能有比我现在更好的方法来实现这一点,但是返回的数据可以是两种具有相同属性的类型: e、 g.数据的简化版本如果另一个对象在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对象的对象
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
}
}
}
]
}