2017-08-15 82 views
0

我登錄的終端可以具有「社會」登錄和「用戶」登錄,這樣身體既可以是這樣的:JSON模式,oneOf驗證

user: { 
    email: '[email protected]', 
    password: 'test' 
} 

或者這樣:

authentication: { 
    provider: 'facebook', 
    token: 'abcd' 
} 

我想要創建一個驗證第一個正文或第二個正文的JSON模式。我偶然發現了oneOf這是我曾嘗試:

body: { 
     oneOf: [{ 
      properties: { 
      user: { 
       type: 'object', 
       required: [ 
       'email', 
       'password' 
       ], 
       email: { 
       type: 'string', 
       format: 'email' 
       }, 
       password: { 
       type: 'string', 
       minLength: 6, 
       maxLength: 32 
       } 
      }, 
      } 
     }, { 
      properties: { 
      authentication: { 
       type: 'object', 
       required: [ 
       'provider', 
       'token' 
       ], 
       provider: { 
       type: 'string', 
       enum: ['facebook'] 
       }, 
       token: { 
       type: 'string' 
       } 
      } 
      } 
     }] 
     } 

但是這給了我以下錯誤:

{ 
     "keyword": "oneOf", 
     "dataPath": ".body", 
     "schemaPath": "#/properties/body/oneOf", 
     "params": {}, 
     "message": "should match exactly one schema in oneOf" 
    } 

將是真棒,如果有人能幫助我做一個JSON模式設置爲這個。謝謝

+0

你的模式是甚至沒有有效的JSON。請修復。 –

回答

2

你可以用oneOf做到這一點。儘管我會以不同的方式使用它。

{ 
    "$schema": "http://json-schema.org/schema#", 
    "type": "object", 
    "properties": { 
    "login": { 
     "oneOf": [ 
     { 
      "required": [ 
      "user" 
      ] 
     }, 
     { 
      "required": [ 
      "authentication" 
      ] 
     } 
     ], 
     "type": "object", 
     "properties": { 
     "user": { 
      "type": "object", 
      "properties": { 
      "email": { 
       "type": "string" 
      }, 
      "password": { 
       "type": "string" 
      } 
      } 
     }, 
     "authentication": { 
      "type": "object", 
      "properties": { 
      "email": { 
       "type": "string" 
      }, 
      "password": { 
       "type": "string" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

有了這個,兩個JSON進行驗證針對該架構

{ 
    "login": { 
    "authentication": { 
     "provider": "facebook", 
     "token": "abcd" 
    } 
    } 
} 

{ 
    "login": { 
    "user": { 
     "email": "[email protected]", 
     "password": "test" 
    } 
    } 
} 

但是,如果你試圖把二者於一身,它不會驗證

{ 
    "login": { 
    "authentication": { 
     "provider": "facebook", 
     "token": "abcd" 
    }, 
    "user": { 
     "email": "[email protected]", 
     "password": "test 
    } 
    } 
}