2013-04-18 1 views
16

첨부 된 JSON 데이터 및 스키마의 유효성 검사에 validictory를 사용하고 있습니다. 지금까지 작업 중입니다.임의의 키를 사용하는 JSON 스키마 유효성 확인

그러나 데이터 사전에는 'bp'이외의 다른 임의의 문자열 키가있을 수 있습니다. 여기의 스키마에서 키 'bp'는 하드 코드 된 것입니다 ... 주어진 목록 (문자열 열거 형)의 문자열 일 수 있습니다. 어떻게하면 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

문제를 재현하는 방법을 보여줄 수 있습니까? 나는 지금 당장 보지 못했다. – jsalonen

+1

@jsalonen : 문제는 최상위 키가 'bp'와 다른 경우 OP가 입력의 유효성을 검사하려고한다는 것입니다. 문제점 설명이 명확하고 JSON 스키마 경험을 가진 사람이 도움을 줄 수 있어야한다고 생각합니다. –

+0

아 맞아요. 감사. – jsalonen

답변

29

정확히 무엇을하려는 것인가에 달려 있습니다.

동일한 사양을 원하지만, 속성의 범위, 당신은 정의 밖으로 추상적 인 경우 :

: 당신이 스키마를 따라 어떤 속성을 원하는 경우

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

, 당신은 additionalProperties을 사용할 수 있습니다

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

또는 속성의 범위 (패턴 일치) - 예를 들어, 어떤 소문자 :

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

당신은, 당신은 "maxProperties"(단지 표준의 V4)를 사용하여 정의 할 수있는 속성의 수를 제한하려면 :

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

P.S.을 - 표준의 v4에서 "필수"는 배열입니다. 사실, v3에서도 "필수"기본값은 false이므로 아무 것도 필요하지 않습니다.

+2

patternProperties가 작업을 수행했습니다 –

+0

가능한 고정 키 세트 (예 : 10 개)라면 첫 번째 옵션이 가장 유용 할 것입니다. 그러나 무한한 (또는 매우 큰) 범위가 있다면'patternProperties'는 확실히 길입니다. – cloudfeet