json 模式是否可用于根据输入数据进行验证

Can json schema be used to validate based on input data

我只是想知道是否可以使用 json 模式根据实际输入数据本身对输入数据进行验证。

假设我有一个对象:

{
parts: {
    123: {
        happy: 'me'
    }
},
cells: [{
    part_id: 123,
    some: 'other property'
}, {
    part_id: 124,
    some: 'thing else'
}]
}

我可以编写一个 json 模式来确保单元格对象的 part_id 实际上对应于传入的部分对象之一吗?

换句话说,part_id: 123是可以接受的,但part_id: 124是不行的。

谢谢!

经过一些研究,看起来 JSON Schema v5 已经通过 $data reference 属性提供了功能。

以下内容来自 javascript 模式验证器 ajv: https://www.npmjs.com/package/ajv#data-reference

$数据参考

使用 v5 选项,您可以使用验证数据中的值作为模式关键字的值。有关其工作原理的更多信息,请参阅 v5 提案。

$data reference支持关键字:constant, enum, format, maximum/minimum, exclusiveMaximum / exclusiveMinimum, maxLength / minLength, maxItems / minItems, maxProperties / minProperties、formatMaximum / formatMinimum、formatExclusiveMaximum / formatExclusiveMinimum、multipleOf、pattern、required、uniqueItems。

“$data”的值应该是一个相对的 JSON-指针。

示例。

此架构要求 属性 较小的值小于或等于 属性 较大的值:

var schema = {
  "properties": {
    "smaller": {
      "type": number,
      "maximum": { "$data": "1/larger" }
    },
    "larger": { "type": number }
  }
};

var validData = {
  smaller: 5,
  larger: 7
};

此架构要求属性与其字段名称具有相同的格式:

var schema = {
  "additionalProperties": {
    "type": "string",
    "format": { "$data": "0#" }
  }
};

var validData = {
  'date-time': '1963-06-19T08:30:06.283185Z',
  email: 'joe.bloggs@example.com'
}

$data 引用已安全解析 - 即使某些 属性 未定义,它也不会抛出。如果 $data 解析为 undefined 则验证成功(排除 constant 关键字)。如果 $data 解析为不正确的类型(例如,最大关键字不是 "number"),则验证失败。