2017-01-18 13 views
1

jsonスキーマに従って検証する場合は、Ajv npmパッケージを使用しています。JSONスキーマがoneOf 2つまたはallOfを検証する

{ 
    "email": "[email protected]", 
    "phone": "9033931947", 
    "country_code": "91" 
} 

私だけメールのいずれかをしたい、またはのみ電話とCOUNTRY_CODE、または3つのプロパティのllがあるはずです。

私はoneOf、allOf、anyOfもテーマを入れ子にしましたが、いくつかの条件では動作し、いくつかの条件では動作しませんでした。

私はあなたが必要とするコード

{ 
    "type": "object", 
    "properties": { 
     "email": { 
      "type": "string", 
      "format": "email", 
      "maxLength": constants.LENGTHS.EMAIL.MAX 
     }, 
     "phone": { 
      "type": "string", 
      "pattern": constants.REGEX.PHONE, 
      "maxLength": constants.LENGTHS.PHONE.MAX 
     }, 
     "country_code": { 
      "type": "string", 
      "pattern": constants.REGEX.COUNTRY_CODE, 
      "maxLength": constants.LENGTHS.COUNTRY_CODE.MAX 
     } 
    }, 
    "anyOf": [ 
     { 
      "required": ["email"], 
     }, 
     { 
      "required": ["phone", "country_code"], 
     }, 
     { 
      "required": ["email", "phone", "country_code"] 
     }, 
    ], 
    "additionalProperties": false 

} 

答えて

1

次試してみました:

"anyOf": [ 
    { 
     "required": ["phone", "country_code"] 
    }, 
    { 
     "required": ["email"], 
     "not": { 
      "anyOf": [ 
       { "required": ["phone"] }, 
       { "required": ["country_code"] } 
      ] 
     } 
    } 
] 

最初のサブスキーマは、あなたが望むものである、現在および不在の両方の電子メールが可能になります。

JSON-schema draft-06に追加されたキーワード「propertyNames」を使用すると(すぐに公開され、Ajv 5.0.1-betaで利用可能)、少しシンプルに(読みやすく)することができます:

"anyOf": [ 
    { 
     "required": ["phone", "country_code"] 
    }, 
    { 
     "required": ["email"], 
     "propertyNames": {"not": {"enum": ["phone", "country_code"] } } 
    } 
] 

それとも、ajv-keywordsで "禁止" 規定されたカスタムキーワードを使用することができます(https://github.com/json-schema-org/json-schema-spec/issues/213を参照してください):

"anyOf": [ 
    { 
     "required": ["phone", "country_code"] 
    }, 
    { 
     "required": ["email"], 
     "prohibited": ["phone", "country_code"] 
    } 
] 
+0

https://stackoverflow.com/questions/25014650/json-schema-example-for-oneofオブジェクトがより良い解決策になる可能性がある –

関連する問題