Partage
  • Partager sur Facebook
  • Partager sur Twitter

Comportement étrange de jsonschema

    11 février 2014 à 17:31:26

    Bonjour à tous,

    Mon programme prend les données nécessaires à son fonctionnement dans un fichier JSON. Ça marche très bien mais je veux ajouter un processus de validation pour éviter de traiter des données invalides de manière simple. J'ai trouvé les schémas JSON et écrit un schéma (valide) pour la structure de données qui m'intéresse, et j'ai choisi le module jsonschema (documentation).

    À la base, je postais ici parce que je ne comprenais pas une erreur complètement absurde renvoyée par la fonction validate() (schéma et données consistants d'après JSON Schema Lint). Comme vous pouvez le voir ci-dessous, en inversant les paramètres de la fonction (donc en faisant l'inverse de ce que dit la documentation et du contenu de help(jsonschema.validate)), ça marche. Ça ne marche qu'en faisant l'inverse de ce qu'il faudrait normalement faire !

    J'aimerai comprendre ce qui se passe. Je ne pense pas avoir fait d'erreur. Ai-je trouvé un bug ?

    Python 3.3.3 (default, Nov 26 2013, 13:33:18) 
    [GCC 4.8.2] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> data_file = open("test3seg.json", "r")
    >>> data = data_file.read()
    >>> data.close()
    >>> schema_file = open("simulation_schema.json", "r")
    >>> schema = schema_file.read()
    >>> schema_file.close()
    >>> import json
    >>> import jsonschema
    >>> data = json.loads(data)
    >>> schema = json.loads(schema)
    >>> jsonschema.validate(data, schema)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python3.3/site-packages/jsonschema/validators.py", line 431, in validate
        cls.check_schema(schema)
      File "/usr/lib/python3.3/site-packages/jsonschema/validators.py", line 76, in check_schema
        raise SchemaError.create_from(error)
    jsonschema.exceptions.SchemaError: True is not of type 'array'
    
    Failed validating 'type' in schema['properties']['properties']['additionalProperties']['properties']['required']:
        {'items': {'type': 'string'},
         'minItems': 1,
         'type': 'array',
         'uniqueItems': True}
    
    On instance['properties']['simulation']['required']:
        True 
    >>> jsonschema.validate(schema, data) # Pas d'exceptions → ça marche
    

    simulation_schema.json :

    {
        "type": "object",
        "properties": {
            "simulation": {
                "type": "object",
                "required": true,
                "properties": {
                    "name": {"type": "string", "required": false},
                    "points": {"type": "integer", "required": true, "minimum": 1},
                    "precision": {"type": "integer", "minimum": 0}
                }
            }
        },
        "segements": {
            "type": "array",
            "required": true,
            "min_items": 1,
            "items": {
                "type": "object",
                "properties": {
                    "id": {"type": "string", "required": true},
                    "parent_id": {"type": "string", "required": true},
                    "pattern": {"type": "string", "required": true},
                    "data": {
                        "type": "object",
                        "required": true,
                        "properties": {
                            "geometry": {
                                "type": "object",
                                "required": true,
                                "properties": {
                                    "length": {"type": "number", "required": true, "minimum": 0, "exclusiveMinimum": true},
                                    "pattern": {"type": "object", "required": true}
                                }
                            },
                            "burning_speed": {"type": "number", "required": true, "minimum": 0, "exclusiveMinimum": true}
                        }
                    }
                }
            }
        }
    }
    

    test3seg.json :

    {
        "simulation": {
            "name": "Test",
            "points": 20,
            "precision": 3
        },
        "segments": [
            {
                "id": "seg1",
                "parent_id": null,
                "pattern": "cylindrical",
                "data": {
                    "geometry": {
                        "length": 1.0,
                        "pattern": {"outer_radius": 0.2, "inner_radius": 0.1}
                    },
                    "burning_speed": 1.0
                }
            },
            {
                "id": "seg2",
                "parent_id": null,
                "pattern": "a pattern",
                "data": {
                    "geometry": {
                        "length": 1.0,
                        "pattern": {"outer_radius": 0.2, "inner_radius": 0.1}
                    },
                    "burning_speed": 1.0
                }
            },
            {
                "id": "seg3",
                "parent_id": "seg1",
                "pattern": "a pattern",
                "data": {
                    "geometry": {
                        "length": 1.0,
                        "pattern": {"outer_radius": 0.2, "inner_radius": 0.1}
                    },
                    "burning_speed": 1.0
                }
            }
        ]
    }
    

    -
    Edité par TD 11 février 2014 à 17:32:36

    • Partager sur Facebook
    • Partager sur Twitter

    Comportement étrange de jsonschema

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown