Json Схема проверки ссылочного свойства на том же объекте - PullRequest
0 голосов
/ 03 апреля 2020

Использование JSON Схема 7 для выполнения проверок

Возможна ли приведенная ниже проверка с использованием схемы json.

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

Свойство prop в объекте является зависимым значением в свойствах.

ie существует только «properties.name», тогда это значение можно добавить в массив «prop»

Примечание:

  • «Свойства» массив может иметь любой объект типа {имя:}
  • «имя» может иметь любую возможную строку, которую я не знаю заранее

Я просматривал документацию, но можно найти ответ.

Не поддерживается ли эта проверка в Json Схема еще?

1 Ответ

0 голосов
/ 08 апреля 2020

Вы не можете сделать это со схемой stati c JSON.

Для ее архивирования вам понадобится проверка схемы Dynami c, но это может быть опасно для внедрения кода из вредоносного кода. пользователи:

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)
}
...