可以使用json模式根据输入数据进行验证

时间:2016-05-04 21:42:17

标签: jsonschema

我只是想知道是否可以使用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不会。

谢谢!

1 个答案:

答案 0 :(得分:2)

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

以下是来自javascript架构验证器ajv: https://www.npmjs.com/package/ajv#data-reference

$ 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 reference被安全地解析 - 即使某些属性未定义,它也不会抛出。如果$ data解析为undefined,则验证成功(排除常量关键字)。如果$ data解析为错误类型(例如,对于最大关键字不是“number”),则验证失败。