JSON模式阵列验证愁楚使用oneOf

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

希望我可以找到一些帮助,这验证问题:我有一个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 /所需#/属性/媒体/项目

jsonschema json-schema-validator
1个回答
0
投票

你的问题是三个部分形成,但前两个有联系,所以我会处理这些,但他们没有一个“解决方案”本身。

  1. 我如何可以验证只有一个数组对象有一个特定的密钥,而有的则没有。

你不能用JSON模式做到这一点。这适用于数组的一组JSON模式关键字没有表达“的值中的一个必须的模式匹配”的手段,而是适用于或者全部是一个数组中的项目,或者在一个特定的项目阵列(如果items是相对于一个对象阵列)。 https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.4

  1. 验证输出是不是我所期望。我希望只看到oneOf的失败分支,它涉及到我的对象类型,它是由type键定义。

该JSON架构规范(草稿-7)不指定任何格式返回错误,但是你得到的错误结构是什么它告诉你(的方面非常“完整的”,类似于我们如何指定的错误应该是返回草案-8)。

想想,验证什么都不知道关于你在你的业务逻辑方面的架构或您的JSON实例。当确认一个JSON例如,验证器可以通过步骤的所有值,并且针对所有适用的子模式测试验证规则。看着你的错误,无论是在oneOf的模式的阵列中都适用于所有项目,等等一切都进行验证测试。如果不符合条件,其他的也将被测试。验证器无法知道,使用oneOf时,你的意图了。

您可以来解决这个问题,通过使用if / then组合。如果您if模式是简单类型的常量,和你的then模式是完整的对象类型,你可能会得到一个更清洁的错误响应,但我没有测试这个理论。

  1. 我想在阵列中的所有项是类型之一。这里发生了什么?

从规范...

items

如果“项目”是一个模式,验证成功,如果阵列中的所有元素成功验证针对该模式。

oneOf

实例成功校验,如果这个关键字 成功校验通过这个定义只有一个模式 关键字的值。

您所做的一切是说:在阵列中的每个项目应根据[schemaA]是有效的。架构:[内的oneOf的模式]:对象应根据这些模式的有效。

我可以看到这是混乱的,当你想“的项目必须是下列之一”,但qazxsw POI独立应用价值模式对每个项目在数组中。

为了让你的意思是什么,移动上述itemsoneOf,然后重构媒体类型到另一个项目的模式之一。

这里有一个sudo的模式。

items

让我知道如果任何这是不明确或者您有任何跟进的问题。

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