JSON-Schema类型和值依赖关系

时间:2017-12-16 13:25:16

标签: json validation jsonschema ajv

是否可以根据另一个人的价值更改字段的架构?

注意:我正在使用Ajv

使用Joi(非JSON-Schema验证器)的示例:

const schema = {
    a: Joi.valid('x', 'y', 'z'),
    b: Joi.string()
        .when('a', { is: 'z', then: Joi.string(), otherwise: Joi.number() }),
};

1 个答案:

答案 0 :(得分:0)

最直接的方法是根据$data pointer建立$ ref链接。不幸的是,目前不支持。

使用应用程序逻辑可能更干净,但如果您处于需要使用模式的情况,则使用oneOf的方式更为冗长。在那种情况下,您的架构将类似于:

var ajv = new Ajv({
  $data: true
});
let schema = {
  oneOf: [ 
    {
      title: 'A is Z',
      type: 'object',
      properties: {
        a: {
          type: 'string',
          enum: ['z']
        },
        b: {
          type: 'string'
        }
      }
    },
    {
      title: 'A is not Z',
      type: 'object',
      properties: {
        a: {
          type: 'string',
          not: {
            enum: ['z']
          }
        },
        b: {
          type: 'number'
        }
      }
    }
  ]
};

let data = {
  a: 'z',
  b: '5'
};

ajv.validate(schema, data)

console.log('ERRORS: ', this.ajv.errors)
<script data-require="ajv@*"  src="https://cdnjs.cloudflare.com/ajax/libs/ajv/5.3.0/ajv.bundle.js"></script>

编辑:由于您使用的是AJV,因此您也可以利用AJV-Keywords module。它有一个if / then / else运算符,目前a proposal用于添加规范。