2

我正在使用 Node 的 AJV(它强制执行 JSON 模式)。

我想验证 array1 properties.bars。很容易。

然后我想确保 array2 中的一个项目properties.keep在 array1 中properties.bars

我该怎么做呢?

我有:

const config = require('../../../config')
const VALID_BARS = Object.keys(config.LHS_RHS_LOOKUP)

const schemaItems = {
  id: 'schemaItems',
  type: 'string',
  anyOf: [
    { enum: VALID_BARS },
    { pattern: '^[^\\s]+ [^\\s]+$' }
  ]
}

const schemaOptions = {
  type: 'object',
  properties: {
    bars: {
      type: 'array',
      default: [VALID_BARS[0]],
      items: schemaItems,
      minItems: 1,
      uniqueItems: true
    },
    keep: {
      type: 'array',
      default: [],
      items: schemaItems, // << THIS NEEDS TO CHANGE
      minItems: 0,
      uniqueItems: true
    },
    protect: {
      default: true,
      type: 'boolean'
    }
  }
}

module.exports = schemaOptions
4

1 回答 1

2

您可能希望使用指向第一个数组的$data 指针。现在只是一个提议。它允许您使用另一个属性的数据值为关键字分配一个值。

所以在这种情况下,第二个数组的 items 属性将有一个 enum 属性,它将使用第一个数组的 $data 值。

为了做到这一点,我必须删除原始模式中的“anyOf”,这样第一个数组就不会最终引用自己。我还通过 $ref 和定义将 schemaItems 组合到主模式中。

这是它的一个 PLNKR

测试代码看起来像:

let schema = {
  definitions: {
    schemaItems: {
      id: 'schemaItems',
      type: 'string',
      pattern: '^[^\\s]+ [^\\s]+$'
    }
  },
  type: 'object',
  properties: {
    bars: {
      type: 'array',
      items: {
        $ref: "#/definitions/schemaItems"
      },
      minItems: 1,
      uniqueItems: true
    },
    keep: {
      type: 'array',
      items: {
        type: 'string',
        enum: {
          "$data": "/bars"
        }
      },
      minItems: 0,
      uniqueItems: true
    },
    protect: {
      default: true,
      type: 'boolean'
    }
  }
};

一个有效的数据样本是:

let data = {
  bars: [
    "d d",
    "b b"
  ],
  keep: [
    "d d"
  ],
  protect: true
};
于 2017-10-26T19:41:11.363 回答