2017-11-16 16 views
0

json-schemaを使用して検証ルールを作成するのは難しいです。ここではJSON形式で自分のデータである。anyOfを使用してネストされたプロパティを検証する方法

{ 
    "headers" : { 
     "api_key" : "aaa-bbb-ccc-ddd-eee" 
    }, 
    "query_string" : { 
     "apikey" : "aaa-bbb-ccc-ddd-eee" 
    } 
} 

私が言うルールが必要です。私はそれが私が「anyOfだと思う

{ 
    "title": "Application Get Single", 
    "type": "object", 
    "properties": { 
    "headers": { 
     "type": "object", 
     "properties": { 
     "api_key": { 
      "type": "string" 
     } 
     } 
    }, 
    "query_string": { 
     "type": "object", 
     "properties": { 
     "apikey": { 
      "type": "string" 
     } 
     } 
    } 
    }, 
    "anyOf": [ 
    {"required": ["headers"["api_key"]]}, // what should this be?? 
    {"required": ["query_string"["apikey"]]} // what should this be?? 
    ] 
} 

At least "headers->api_key" or "query_string->apikey" needs to be present in the json, but not both.

ここ

を自分のスキーマ検証はこれまでにあり探していますが、上記のネストされたjson項目を参照する方法はわかりません。

JSON syntax is malformed

私はこのためにPHPで働いていると私はJustin Rainbowを使用しています:私はエラーを取得する瞬間

答えて

1

いくつかの方法があります。最も簡単である:

{ 
    "title": "Application Get Single", 
    "type": "object", 
    "properties": { 
    "headers": { 
     "type": "object", 
     "properties": { 
     "api_key": { 
      "type": "string" 
     } 
     } 
    }, 
    "query_string": { 
     "type": "object", 
     "properties": { 
     "apikey": { 
      "type": "string" 
     } 
     } 
    } 
    }, 
    "anyOf": [ 
    { 
     "properties": { 
     "headers": { 
      "type": "object", 
      "required":["api_key"] 
     } 
     } 
    }, 
    { 
     "properties": { 
     "query_string": { 
      "type": "object", 
      "required":["apikey"] 
     } 
     } 
    } 
    ] 
} 

おそらく、またいずれかのヘッダーまたはQUERY_STRINGが存在することを確実にするために、ルートオブジェクトに"minProperties": 1をしたいと思います。

EDITは:headers.api_keyとquery_string.apikeyはトリックが「ではなく、他の」一部ですoneOf

1

に変更anyOf相互に排他的である場合だけで、質問を再読み込みして。ここで私は(ドラフト-06と仮定以降、ドラフト-04については下記参照)をお勧めしたいものです:ドラフト-04については

{ 
    "title": "Application Get Single", 
    "type": "object", 
    "properties": { 
    "headers": { 
     "type": "object", 
     "properties": { 
     "api_key": { 
      "type": "string" 
     } 
     } 
    }, 
    "query_string": { 
     "type": "object", 
     "properties": { 
     "apikey": { 
      "type": "string" 
     } 
     } 
    } 
    }, 
    "oneOf": [ 
    { 
     "required": ["headers"], 
     "query_string": false 
    }, 
    { 
     "required": ["query_string"], 
     "headers": false 
    } 
    ] 
} 

は、同じことを意味しますが読み迷惑です{"not": {}}falseを交換してください。しかし、ドラフト04のほとんどの場所でブール型スキーマを使用することはできません。したがって、「このプロパティは存在してはいけません」という冗長な方法が必要です。

関連する問題