我的ExclusiveMinimum属性实现正确吗?

时间:2018-07-09 06:04:32

标签: python json jsonschema

我正在使用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
    }

1 个答案:

答案 0 :(得分:1)

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

第三,$ref。一直到草稿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”只是“多于零”的简写。您可以随意命名。)