当前位置: 首页 > 知识库问答 >
问题:

根据包含多个模式定义的JSON模式进行验证

谭吉星
2023-03-14

我正在创建一个用于Postman的JSON模式,其中包含一些模式定义。我针对模式验证的JSON需要与模式定义之一匹配。

示例模式

{
  "oneOf": [
    {
      "$ref": "#/definitions/schema1"
    },
    {
      "$ref": "#/definitions/schema2"
    },
    {
      "$ref": "#/definitions/schema3"
    }
  ],
  "definitions": {
    "schema1": {
      "type": "object",
      "properties": {
        "propertyA": {
          "type": "string"
        }
      },
      "required": [
        "propertyA"
      ]
    },
    "schema2": {
      "type": "object",
      "properties": {
        "propertyB": {
          "type": "string"
        }
      },
      "required": [
        "propertyB"
      ]
    },
    "schema3": {
      "type": "object",
      "properties": {
        "propertyC": {
          "type": "string"
        }
      },
      "required": [
        "propertyC"
      ]
    }
  }
}

JSON数据示例

此JSON根据模式进行验证,并正确标记为无效(因为需要字符串):

{
    "propertyA": 123
}

问题

此示例根据https://www.jsonschemavalidator.net/返回4个错误:

  • 消息:JSON对“oneOf”中的任何模式都无效。模式路径:#/oneOf

我只对错误消息感兴趣,它说它需要一个字符串。如何在将架构定义保存在一个文件中的同时避免这些其他错误消息?

共有1个答案

扈运浩
2023-03-14

是的,oneOf对于这种事情来说很糟糕。如果/那么很冗长,但会给你更好的结果。基本上,您需要确定一些决定模式是否应适用于实例的条件。

通常,该条件是公共字段的值。在这种情况下,如果正在验证的实例是一个具有“type”:“A”的对象,那么它必须根据/definitions/A模式进行验证。如果它有“type”:“B”,那么它必须根据/definitions/B模式进行验证。

{
  "allOf": [
    {
      "if": {
        "properties": {
          "type": { "const": "A" }
        },
        "required": ["type"]
      },
      "then": { "$ref": "#/definitions/a" }
    },
    {
      "if": {
        "properties": {
          "type": { "const": "B" }
        },
        "required": ["type"]
      },
      "then": { "$ref": "#/definitions/b" }
    }
  ]
}

如果您的条件是存在特定字段,您可以使用依赖项关键字作为快捷方式。如果被验证的实例是具有“属性A”属性的对象,则该实例必须对/定义/a模式有效。同样对于“属性B”。

{
  "dependencies": {
    "propertyA": { "$ref": "#/definitions/a" },
    "propertyB": { "$ref": "#/definitions/b" }
  }
}

您的示例实际上有一个非常简单的解决方案,但我回答了一般情况,因为我假设您的实际模式比示例更复杂。

{
  "type": "object",
  "properties": {
    "propertyA": { "type": "string" },
    "propertyB": { "type": "string" },
    "propertyC": { "type": "string" }
  },
  "oneOf": [
    { "required": ["propertyA"] },
    { "required": ["propertyB"] },
    { "required": ["propertyC"] }
  ]
}
 类似资料:
  • 问题内容: 有没有一种方法可以针对该结构的JSON模式验证JSON结构?我已经查看并发现JSON.Net验证了,但这并不能满足我的要求。 JSON.net可以: 这证明是正确的。 这也证明是真的 仅此验证为假。 理想情况下,我希望它可以验证那里也没有应该存在的字段。 问题答案: 我认为您只需要添加 到您的架构。这将停止提供未知属性。 因此,现在您的结果将是:-正确,错误,错误 测试代码… 输出:-

  • 这是要根据模式验证的JSON。 问题是,如果我们传递了错误的数据,它将正确地验证eid和ename的类型(即整数或字符串)。对于例如: 如果我们为限定传递了错误的类型,那么它将验证为true(即,它不验证限定的类型,可能是因为它是嵌套的)。

  • 我正在寻找一个解决方案来解决Swagger(OpenAPI)数据类型和JSON模式之间处理数据类型空值的不兼容性。 我们的swagger文件包含所有模式定义,我想使用JSON。Net模式,用于API测试中的模式验证步骤。 有效的swagger属性定义: 将失败JSON模式验证空值()。 如果我将可为空的属性定义替换为: 对于空值,验证将是成功的,但这打破了昂首阔步的语法。 我找不到的OpenAPI

  • 问题内容: 我从一些JSON文件创建了API规范,并且尝试测试这些文件是否根据API规范进行了验证。 有一些不错的工具可以根据JSON Schema进行验证,但是我没有找到针对Swagger中创建的规范进行验证的工具(用于创建API架构的工具)。我发现的唯一解决方案是在Swagger- Editor中生成客户端/服务器,这非常麻烦。 是否已经有现有工具可以针对Swagger Schema验证JSO

  • 我从一些JSON文件中创建了一个API规范,并尝试测试这些文件是否符合API规范。 有一些很好的工具可以验证JSON模式,但是我没有机会找到一个工具来验证在Swagger(创建API模式的工具)中创建的规范。我找到的唯一解决方案是在Swagger-Editor中生成客户端/服务器,这很麻烦。 是否已经有一个现有工具可以根据Swagger模式验证JSON?

  • 问题: 有没有一种普通的或本机的javascript方法来根据JSON模式验证JSON脚本? 我在Github上找到了很多库,但没有原生/普通的解决方案。EcmaScript没有对此的规范吗?没有浏览器(或nodejs)有办法原生验证JSON吗? 问题的背景: 我有一个非常复杂的模式,我开发了一个。它应该与一个脚本一起工作,该脚本要求传入其中的 JSON 数据符合架构。