【问题标题】:Json Schema validate reference property on same objectJson Schema 验证同一对象上的引用属性
【发布时间】:2020-07-15 12:17:49
【问题描述】:

使用 JSON Schema 7 执行验证

是否可以使用 json 模式进行以下验证。

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

对象中的“prop”属性是属性中的依赖值。

即只有“properties.name”存在,然后该值可以添加到“prop”数组中

注意:

  • “属性”数组可以有任何类型为 {name : } 的对象
  • “name”可以有任何可能的字符串,我事先并不知道

我一直在浏览文档,但可以找到答案。

Json Schema 中还不支持此验证吗?

【问题讨论】:

  • 这不是你可以在 JSON Schema 中做的事情,也不是我们将要添加的事情。这是更多的业务逻辑。 JSON Schema 专注于 JSON 的耻辱和结构。

标签: json json.net jsonschema json-schema-validator


【解决方案1】:

您不能使用静态 JSON 架构来做到这一点。

要存档它,您需要动态架构验证,但这可能会导致恶意用户的代码注入危险:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-18
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多