【问题标题】:Is my implementation of exclusiveMinimum property correct?我对 ExclusiveMinimum 属性的实现是否正确?
【发布时间】:2018-07-09 06:04:31
【问题描述】:

我正在使用JsonSchema 2.6.0 来验证我的 python 程序的表单数据。

我正在尝试实现exclusiveMinimum,但是当我发布到表单时,它接受 0 作为有效值,但它不应该。

        from jsonschema import Draft3Validator

        orderValidationSchema = {
            "$schema": "http://json-schema.org/draft-04/schema#",
            "type": "object",
            "properties": {
                "total_amount": {
                    "$ref": "#/definitions/floatRef",
                    "required": "true",
                    "exclusiveMinimum": 0
                },
                "payable_amount": {
                    "$ref": "#/definitions/floatRef",
                    "required": "true",
                    "exclusiveMinimum": 0
                },
            },
            "definitions": {
                "floatRef": {
                    "type": "number",
                },
            }
        }

在经历了几个 git 问题和其他链接后,我按照下面显示的方式尝试了它,但仍然没有用。

        from jsonschema import Draft3Validator

        orderValidationSchema = {
            "$schema": "http://json-schema.org/draft-04/schema#",
            "type": "object",
            "properties": {
                "total_amount": {
                    "$ref": "#/definitions/floatRef",
                    "required": "true",
                    "minimum": 0,
                    "exclusiveMinimum": "true"
                },
                "payable_amount": {
                    "$ref": "#/definitions/floatRef",
                    "required": "true",
                    "minimum": 0,
                    "exclusiveMinimum": "true"
                },
            },
            "definitions": {
                "floatRef": {
                    "type": "number",
                },
            }
        }

如果我犯了任何错误,请告诉我。

我正在使用Draft3Validator,以防万一有任何与之相关的问题。

以下是传递给此架构的 json。

    {
         "total_amount" : 100000,
         "payable_amount" : 10000
    }

【问题讨论】:

  • 您能否提供您尝试验证的 JSON 实例?
  • 一个问题是您使用的是 Draft3Validator,但您的架构标识为草稿 4 JSON 架构。
  • 我已经用我传递的 JSON 更新了问题。至于另一个问题,Draft3validator 在我创建的另一个模式中完美工作,我在其中引用了 Draft-4 JSON 模式。
  • 太棒了!我有一个解决方案给你。立即发布。

标签: python json jsonschema


【解决方案1】:

您的架构存在一些问题。 首先,exclusiveMinimum 必须是布尔值,而不是字符串。 其次,required 需要是对象级别,而不是属性级别,因为架构被指定为 Draft-4 架构。如果可能,您应该使用 Draft4Validator。

第三,$ref。这个关键字,一直到 draft-7,替换了整个对象的内容,这意味着该对象中的其他关键字被忽略。 解决方案是将要应用于实例属性的两个模式包装在allOf 中。我已经使用以下架构演示了这一点,这似乎可以满足您的要求。

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "total_amount": {
      "$ref": "#/definitions/floatRefMTZ"
    },
    "payable_amount": {
      "$ref": "#/definitions/floatRefMTZ"
    }
  },
  "required": ["total_amount", "payable_amount"],
  "definitions": {
    "floatRef": {
      "type": "number"
    },
    "floatRefMTZ": {
      "allOf": [
        {
          "$ref": "#/definitions/floatRef"
        },
        {
          "minimum": 0,
          "exclusiveMinimum": true
        }
      ]
    }
  }
}

(“MTZ”只是More Than Zero的简写。你可以随意称呼它。)

【讨论】:

  • 谢谢,它有效!不过需要进行一些调整,因为 draft3validators 不支持列表。将此标记为正确答案。非常感谢!
  • 不客气。是的,如果您不能使用 draft-4,那么您将不得不修改 required 关键字的使用。我们强烈建议您使用最新的草稿。该实现支持 3、4 和 6。您是否有任何原因无法从 Draft-3 迁移?
  • 它在我们的应用程序中与其他服务一起使用,并且有一些我们现在不想解决的依赖关系。但我们最终会在接下来的几个月内完成第 4 稿。
  • 嗯,好的。如果可以的话,我会转向 Draft-6,因为它比 4 更接近最终规范。该库对 7 的支持也在路上!
猜你喜欢
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-12
  • 2015-11-28
  • 1970-01-01
相关资源
最近更新 更多