2013-04-18 40 views
16

Tôi đang sử dụng tính hợp lệ để xác thực dữ liệu JSON và lược đồ được đính kèm. Làm việc cho đến thời điểm này.Xác thực lược đồ JSON với các khóa tùy ý

Tuy nhiên, từ điển dữ liệu có thể có các phím chuỗi tùy ý (những người khác không phải là 'bp' nhưng). Khóa 'bp' trong lược đồ ở đây được mã hóa cứng ... nó có thể là một chuỗi từ một danh sách đã cho (chuỗi của chuỗi). Làm thế nào để thêm định nghĩa enum ở đây cho "cấp độ đầu tiên" của dict.

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

Bạn có thể chỉ cho chúng tôi cách tạo lại sự cố không? Tôi không thấy gì ngay bây giờ. – jsalonen

+1

@jsalonen: vấn đề là OP muốn xác thực đầu vào nếu khóa cấp cao nhất là khác với 'bp'. Tôi nghĩ rằng mô tả vấn đề là đủ rõ ràng và một người có trải nghiệm lược đồ JSON sẽ có thể trợ giúp. –

+0

À phải rồi. Cảm ơn. – jsalonen

Trả lời

29

Tùy thuộc vào chính xác những gì bạn đang cố gắng làm.

Nếu bạn muốn các đặc điểm kỹ thuật tương tự, nhưng đối với một loạt các thuộc tính, bạn có thể trừu tượng ra định nghĩa:

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

Nếu bạn muốn bất kỳ tính theo sơ đồ đó, bạn có thể sử dụng additionalProperties:

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

Hoặc một loạt các tài sản (kết hợp bởi một mô hình) - ví dụ, bất cứ điều gì thấp hơn trường hợp:

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

Nếu bạn muốn giới hạn số lượng các thuộc tính có thể được xác định, sau đó bạn có thể sử dụng "maxProperties" (v4 của tiêu chuẩn duy nhất):

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

T.B. - trong v4 của tiêu chuẩn, "bắt buộc" là một mảng. Thực tế, ngay cả trong v3, "bắt buộc" mặc định là false, vì vậy ví dụ của bạn không cần nó ở tất cả

+2

patternProperties đã thực hiện công việc –

+0

Tôi nên nói rằng nếu đó là tập hợp các khóa có thể cố định (ví dụ: 10 hoặc hơn), thì tùy chọn đầu tiên có lẽ là mô tả nhất. Tuy nhiên, nếu có bất kỳ phạm vi vô hạn nào (hoặc cực kỳ lớn) của chúng, thì 'patternProperties' chắc chắn là con đường để đi. – cloudfeet

Các vấn đề liên quan