Saltar al contenido

Esquema JSON: validar un número-o-null valor

Agradeceríamos tu apoyo para extender nuestros artículos en referencia a las ciencias informáticas.

Solución:

En el borrador-04, usaría la directiva anyOf:


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

También podrías usar “tipo”: [“number”, “null”] como sugiere Adam, pero creo que anyOf es más limpio (siempre que use una implementación draft-04), y vincula la declaración mínima y máxima al número explícitamente.

Descargo de responsabilidad: no sé nada sobre la implementación de python, mi respuesta es sobre el esquema json.

El truco es usar un tipo array. En vez de:

"type": "number"

Usar:

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

El siguiente código impone un número-o-null política, más restricciones numéricas si el valor es un número:

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

Lo que da:

"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

Sección de Reseñas y Valoraciones

Recuerda algo, que te concedemos añadir un criterio objetivo si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *