2013-04-18 16 views
16

Używam validictory do sprawdzania poprawności dołączonych danych JSON i schematu. Dotychczasowa praca.Walidacja schematu JSON z arbitralnymi kluczami

Jednak słownik danych może mieć arbitralne klucze strunowe (inne niż "bp", ale). Klucz "bp" w tym schemacie jest zakodowany na stałe ... może być ciągiem z podanej listy (wyliczenie ciągu znaków). Jak dodać tutaj definicję enum dla "pierwszego poziomu" dyktatury.

import json 
import validictory 

data = {'bp': [{'category': 'bp', 
     'created': '2013-03-08T09:14:48.148000', 
     'day': '2013-03-11T00:00:00', 
     'id': 'dc049c0e-d19a-4e3e-93ea-66438a239712', 
     'unit': 'mmHg', 
     'value': 147.0, 
     'value2': 43.0}]} 


schema = { 
    "type":"object", 
    "properties":{ 
     "bp": { 
      "type":"array", 
      "required":False, 
      "items": 
       { 
        "type":"object", 
        "required":False, 
        "properties":{ 
         "category": { 
          "type":"string", 
          "default": "bp", 
          "required":False 
         }, 
         "created": { 
          "type":"string", 
          "default": "2013-03-08T09:14:48.148000", 
          "required":False 
         }, 
         "day": { 
          "type":"string", 
          "default": "2013-03-11T00:00:00", 
          "required":False 
         }, 
         "id": { 
          "type":"string", 
          "default": "dc049c0e-d19a-4e3e-93ea-66438a239712", 
          "required":False 
         }, 
         "unit": { 
          "type":"string", 
          "default": "mmHg", 
          "required":False 
         }, 
         "value2": { 
          "type":"number", 
          "default":43, 
          "required":False 
         }, 
         "value": { 
          "type":"number", 
          "default":147, 
          "required":False 
         } 
        } 
       } 


     } 
    } 
} 

validictory.validate(data,schema) 
+0

Czy możesz pokazać nam, jak odtworzyć problem? Teraz nie widzę żadnych. – jsalonen

+1

@jsalonen: Problem polega na tym, że OP chce sprawdzić poprawność danych wejściowych, jeśli klucz najwyższego poziomu jest nieco inny niż "bp". Myślę, że opis problemu jest wystarczająco jasny i ktoś z doświadczeniem JSON-schema powinien być w stanie Ci pomóc. –

+0

Ach tak. Dzięki. – jsalonen

Odpowiedz

29

To zależy od tego, co dokładnie chcesz zrobić.

Jeśli chcesz taką samą specyfikację, ale w odniesieniu do zakresu właściwości, można abstrakcyjny z definicji:

{ 
    "type": "object", 
    "properties": { 
     "bp": {"$ref": "#/definitions/categoryList"}, 
     "foo": {"$ref": "#/definitions/categoryList"}, 
     "bar": {"$ref": "#/definitions/categoryList"} 
    }, 
    "definitions": { 
     "categoryList": {...} 
    } 
} 

Jeśli chcesz żadnych właściwości wynika z tego schematu, można użyć additionalProperties:

{ 
    "type": "object", 
    "additionalProperties": {...} 
} 

lub zakres właściwości (dopasowane wzorzec) - na przykład nic małe litery:

{ 
    "type": "object", 
    "patternProperties": { 
     "^[a-z]+$": {...} 
    } 
} 

Jeśli chcesz ograniczyć liczbę właściwości, które mogą być zdefiniowane, a następnie można użyć „maxProperties” (V4 standardu tylko):

{ 
    "type": "object", 
    "additionalProperties": {...}, 
    "maxProperties": 1 
} 

PS: - w wersji 4 standardu "wymagany" to tablica. W rzeczywistości, nawet w wersji 3, "wymagane" domyślnie jest ustawione na false, więc Twój przykład nie potrzebuje tego w ogóle.

+2

Polecenie patternProperties wykonało zadanie –

+0

Powiedziałbym, że jeśli jest to ustalony zestaw możliwych kluczy (na przykład 10 lub więcej), to pierwsza opcja jest prawdopodobnie najbardziej opisowa. Jednakże, jeśli istnieje jakiś nieskończony (lub bardzo duży) zakres ich, to 'patternProperties' jest zdecydowanie drogą do zrobienia. – cloudfeet

Powiązane problemy