简体   繁体   中英

Json Schema validate reference property on same object

Using JSON Schema 7 to perform validations

Is the below validation possible using json schema.

 {
    properties : [{name: "a"}, {name: "b"}, {name: "c"}],
    rules : [{ prop : ["a","b"] }, { prop : ["a"] }, {prop: ["c"]}]
 }

The "prop" property in object is dependent values in properties.

ie only of "properties.name" exists then that value can be added to the "prop" array

Note:

  • The "properties" array can have any object of type {name: }
  • "name" can have any possible string, which i don't know beforehand

I have been going through documentation, but can find a answer.

Is this validation not supported in Json Schema yet?

You can't do it with a static JSON schema.

To archive it you would need a dynamic schema validation, but this could be dangerous to code injection from malicious users:

const Ajv = require('ajv')

const ajv = new Ajv({ allErrors: true, jsonPointers: true })

const data = {
  properties: [{ name: 'a' }, { name: 'b' }, { name: 'c' }],
  rules: [{ prop: ['a', 'b'] }, { prop: ['a', 'zz'] }, { prop: ['c'] }]
}

const validProp = data.properties.map(_ => _.name)

const schema = {
  type: 'object',
  required: ['properties', 'rules'],
  properties: {
    properties: {
      type: 'array',
      items: {
        type: 'object',
        required: ['name'],
        properties: {
          name: { type: 'string' }
        }
      }
    },
    rules: {
      type: 'array',
      items: {
        type: 'object',
        required: ['prop'],
        properties: {
          prop: {
            type: 'array',
            uniqueItems: true,
            items: {
              type: 'string',
              enum: validProp // here happen the validation
            }
          }
        }
      }
    }
  }
}

const isValid = ajv.validate(schema, data)
if (!isValid) {
  console.log(ajv.errors)
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM