programing

JSON Schema: number-or-null 값을 확인합니다.

lastmemo 2023. 3. 2. 21:55
반응형

JSON Schema: number-or-null 값을 확인합니다.

JSON 스키마 속성을 숫자로 하거나null?

API를 구축하고 있습니다.heading기여하다.0(포함)에서 360(포함) 사이의 숫자 또는 null을 사용할 수 있으므로 다음 입력은 정상입니다.

{"heading": 5}
{"heading": 0}
{"heading": null}
{"heading": 12}
{"heading": 120}
{"heading": null}

또한 다음 입력이 잘못되어 있습니다.

{"heading": 360}
{"heading": 360.1}
{"heading": -5}
{"heading": false}
{"heading": "X"}
{"heading": 1200}
{"heading": false}

부록:

anyOf확실히 정답입니다.알기 쉽게 하기 위해 전체 스키마를 추가합니다.

스키마

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "heading": {
        "anyOf": [
          {"type": "number"},
          {"type": "null"}
        ]
      }
    }
}

draft-04에서는 anyOf 디렉티브를 사용합니다.

{
  "anyOf": [
    {
      "type": "number",
      "minimum": 0,
      "maximum": 360,
      "exclusiveMaximum": true
    },
    {
      "type": "null"
    }
  ]
}

Adam의 제안대로 "type" : [ number ], "null"을 사용할 수도 있지만, (draft-04 구현을 사용하는 한) anyOf가 더 깔끔하고 최소 선언과 최대 선언을 숫자에 명시적으로 관련지을 수 있습니다.

면책사항:저는 python 구현에 대해 아는 것이 없습니다.제 대답은 json 스키마에 관한 것입니다.

비결은 유형 배열을 사용하는 것입니다.대신:

"type": "number"

용도:

"type": ["number", "null"]

다음 코드는 number-or-null 정책을 적용하고 값이 숫자일 경우 숫자 제한을 적용합니다.

from jsonschema import validate
from jsonschema.exceptions import ValidationError
import json

schema=json.loads("""{
  "$schema": "http://json-schema.org/schema#",
  "description": "Schemas for heading: either a number within [0, 360) or null.",
  "title": "Tester for number-or-null schema",
  "properties": {
    "heading": {
      "type": ["number", "null"],
      "exclusiveMinimum": false,
      "exclusiveMaximum": true,
      "minimum": 0,
      "maximum": 360
    }
  }
}""")

inputs = [
{"heading":5}, {"heading":0}, {"heading":360}, {"heading":360.1},
{"heading":-5},{"heading":None},{"heading":False},{"heading":"X"},
json.loads('''{"heading":12}'''),json.loads('''{"heading":120}'''),
json.loads('''{"heading":1200}'''),json.loads('''{"heading":false}'''),
json.loads('''{"heading":null}''')
]

for input in inputs:
    print "%-30s" % json.dumps(input),
    try:
        validate(input, schema)
        print "OK"
    except ValidationError as e:
        print e.message

그 결과:

{"heading": 5}                 OK
{"heading": 0}                 OK
{"heading": 360}               360.0 is greater than or equal to the maximum of 360
{"heading": 360.1}             360.1 is greater than or equal to the maximum of 360
{"heading": -5}                -5.0 is less than the minimum of 0
{"heading": null}              OK
{"heading": false}             False is not of type u'number', u'null'
{"heading": "X"}               'X' is not of type u'number', u'null'
{"heading": 12}                OK
{"heading": 120}               OK
{"heading": 1200}              1200.0 is greater than or equal to the maximum of 360
{"heading": false}             False is not of type u'number', u'null'
{"heading": null}              OK

언급URL : https://stackoverflow.com/questions/22565005/json-schema-validate-a-number-or-null-value

반응형