2017-08-15 57 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 
    } 
    } 
}