【问题标题】:JSON Schema / AJV array item must be in another arrayJSON Schema / AJV 数组项必须在另一个数组中
【发布时间】:2018-03-24 17:21:26
【问题描述】:

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

我想验证 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

【问题讨论】:

    标签: node.js jsonschema ajv


    【解决方案1】:

    您可能希望对第一个数组使用$data pointer。现在它只是一个proposal。它允许您使用另一个属性的 data 值为 keyword 赋值。

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

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

    这是a 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
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 2018-11-25
      • 2019-11-14
      • 1970-01-01
      相关资源
      最近更新 更多