希望我可以找到一些帮助,这验证问题:我有一个JSON数组,可以有多个对象类型(视频,图像)。内的阵列,所述对象具有rel
字段值。我工作的情况是,只能有与"rel": "primaryMedia"
一个对象合法的 - 无论是视频或图像。
以下是对于图像和视频的情况下对象表示,二者示出了"rel": "primaryMedia"
。
{
"media": [
{
"caption": "Caption goes here",
"id": "ncim87659842",
"rel": "primaryMedia",
"type": "image"
},
{
"description": "Shaima Swileh arrived in San Francisco after fighting for 17 months to get a waiver from the U.S. government to be allowed into the country to visit her son.",
"headline": "Yemeni mother arrives in U.S. to be with dying 2-year-old son",
"id": "mmvo1402810947621",
"rel": "primaryMedia",
"type": "video"
}
]
}
下面是我创建的验证此使用oneOf
(假设这将处理我的情况)架构的精简版本。但是,它没有,工作打算。
{
"$id": "http://example.com/schema/rockcms/article.json",
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {},
"properties": {
"media": {
"items": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"caption": {
"type": "string"
},
"id": {
"type": "string"
},
"rel": {
"enum": [
"primaryMedia"
],
"type": "string"
},
"type": {
"enum": [
"image"
],
"type": "string"
}
},
"required": [
"caption",
"id",
"rel",
"type"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"description": {
"type": "string"
},
"headline": {
"type": "string"
},
"id": {
"type": "string"
},
"rel": {
"enum": [
"primaryMedia"
],
"type": "string"
},
"type": {
"enum": [
"video"
],
"type": "string"
}
},
"required": [
"description",
"headline",
"id",
"rel",
"type"
],
"type": "object"
}
]
},
"type": "array"
}
}
}
使用JSON模式验证在https://www.jsonschemavalidator.net,模式验证数据时正确地呈现,但试图抓住错误时,无法正常工作。
在下面的情况下,headline
加入了视频和它缺少id
。这应该失败,因为headline
是不允许的视频和id
是必需的。
{
"media": [
{
"headline": "Yemeni mother arrives in U.S. to be with dying 2-year-old son",
"rel": "primaryMedia",
"type": "video"
}
]
}
我从验证获得满意的结果,但是,是不是完全预期。似乎它混为一谈在其响应两个对象模式。
除了这个,我已经分别发现,该模式将允许在media
视频和图像对象,这是不期望的人口。
一直在试图找出我做错了,但我难倒。非常感谢一些反馈,如果任何人所提供的。提前致谢!
验证回应:
消息:JSON是针对没有从“oneOf”模式有效。架构路径:#/属性/媒体/项目/ oneOf
消息:住宅“标题”尚未定义和模式不允许附加属性。架构路径:#/属性/媒体/项目/ oneOf / 0 / additionalProperties
消息:值“视频”未在枚举定义。架构路径:#/属性/媒体/项目/ oneOf / 0 /属性/类型/枚举
消息:必需属性从对象丢失:说明中,ID。架构路径:/ oneOf / 1 /所需#/属性/媒体/项目
消息:必需的属性是从对象丢失:标题,ID。架构路径:/ oneOf / 0 /所需#/属性/媒体/项目
你的问题是三个部分形成,但前两个有联系,所以我会处理这些,但他们没有一个“解决方案”本身。
- 我如何可以验证只有一个数组对象有一个特定的密钥,而有的则没有。
你不能用JSON模式做到这一点。这适用于数组的一组JSON模式关键字没有表达“的值中的一个必须的模式匹配”的手段,而是适用于或者全部是一个数组中的项目,或者在一个特定的项目阵列(如果items
是相对于一个对象阵列)。 https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.4
- 验证输出是不是我所期望。我希望只看到
oneOf
的失败分支,它涉及到我的对象类型,它是由type
键定义。
该JSON架构规范(草稿-7)不指定任何格式返回错误,但是你得到的错误结构是什么它告诉你(的方面非常“完整的”,类似于我们如何指定的错误应该是返回草案-8)。
想想,验证什么都不知道关于你在你的业务逻辑方面的架构或您的JSON实例。当确认一个JSON例如,验证器可以通过步骤的所有值,并且针对所有适用的子模式测试验证规则。看着你的错误,无论是在oneOf
的模式的阵列中都适用于所有项目,等等一切都进行验证测试。如果不符合条件,其他的也将被测试。验证器无法知道,使用oneOf
时,你的意图了。
您可以来解决这个问题,通过使用if
/ then
组合。如果您if
模式是简单类型的常量,和你的then
模式是完整的对象类型,你可能会得到一个更清洁的错误响应,但我没有测试这个理论。
- 我想在阵列中的所有项是类型之一。这里发生了什么?
从规范...
items
:
如果“项目”是一个模式,验证成功,如果阵列中的所有元素成功验证针对该模式。
oneOf
:
实例成功校验,如果这个关键字 成功校验通过这个定义只有一个模式 关键字的值。
您所做的一切是说:在阵列中的每个项目应根据[schemaA]是有效的。架构:[内的oneOf
的模式]:对象应根据这些模式的有效。
我可以看到这是混乱的,当你想“的项目必须是下列之一”,但qazxsw POI独立应用价值模式对每个项目在数组中。
为了让你的意思是什么,移动上述items
的oneOf
,然后重构媒体类型到另一个项目的模式之一。
这里有一个sudo的模式。
items
让我知道如果任何这是不明确或者您有任何跟进的问题。