2013-04-18 17 views
16

私は、接続されたJSONデータとスキーマの検証にvalidictoryを使用しています。これまでの作業。 任意のキーを使用したJSONスキーマ検証

ただし、データ辞書には任意の文字列キー( 'bp'以外の文字キー)を使用できます。ここのスキーマのキー 'bp'はハードコードされています...指定されたリスト(文字列の列挙体)からの文字列にすることができます。ここでは、enum定義をここのdictの「第1レベル」に追加します。

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:問題は、OPがトップレベルのキーが 'bp'と異なるものであれば、入力を検証したいという問題です。私は問題の説明が十分明確であり、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

関連する問題