我如何需要两个jsonschema属性中的一个,但还要设置默认值?

2024-09-25 00:28:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试验证一个jsonschema,该jsonschema定义了一个带有radiusdiameter或两者都没有的圆,然后只设置一个默认半径。这是我的模式:

{
  "properties": {
    "position": {},
    "radius": {
      { "type": "number" }
    },
    "diameter": {
      { "type": "number" }
    }
  },
  "oneOf": [
    {
      "required": ["radius"]
    },
    {
      "required": ["diameter"]
    },
    {
      "properties": {
        "radius": {
          "default": 16
        }
      }
    }
  ],
  "additionalProperties": false
}

这是设置默认值的验证器(如JSON schema FAQ所述):

from jsonschema import Draft7Validator, validators

def extend_with_default(validator_class):
  validate_properties = validator_class.VALIDATORS['properties']

  def set_defaults(validator, properties, instance, schema):
    for property, subschema in properties.items():
      if 'default' in subschema:
        instance.setdefault(property, subschema['default'])

    for error in validate_properties(
      validator, properties, instance, schema,
    ):
      yield error

  return validators.extend(
    validator_class, {'properties' : set_defaults},
  )
Validator = extend_with_default(Draft7Validator)

该验证器在我验证模式之前设置默认值,因此我只能设置半径或两者都不设置,但设置直径将始终引发错误。 如果我将此更改为先验证,然后再设置默认值(我不希望这样,但可以),那么它将设置默认半径,尽管所需的直径已经存在

是否有一些方法可以通过在python中设置默认半径来实现这一点,而无需对其进行硬编码


Tags: instanceindefaultschematype模式半径properties
1条回答
网友
1楼 · 发布于 2024-09-25 00:28:59

验证程序不需要更改。这是一个可能的解:

{
  "properties": {
    "position": {},
    "radius": {
      { "type": "number" }
    },
    "diameter": {
      { "type": "number" }
    }
  },
  "if": {
    "not": {
      "anyOf": [
        {
          "required": ["radius"]
        },
        {
          "required": ["diameter"]
        }
      ]
    }
  },
  "then": {
    "properties": {
      "radius": {
        "default": 16
      }
    }
  },
  "oneOf": [
    {
      "required": ["radius"]
    },
    {
      "required": ["diameter"]
    }
  ],
  "additionalProperties": false
}

if仅当未设置半径或直径时才为真。只有这样,才会设置默认半径。之后oneOf检查是否同时只设置了一个参数

相关问题 更多 >