2016-05-04 116 views
1

我只是想知道是否有可能使用json模式来验证输入数据根据实际的输入数据本身。可以使用json模式来验证基于输入数据

说我有一个对象:

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

我可以写保证小区对象的PART_ID实际上对应于传入的部分对象中的一个JSON模式?

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

谢谢!

回答

2

经过一番研究,看起来JSON Schema v5的功能已经通过$data reference属性。

以下是JavaScript的架构验证,ajv: https://www.npmjs.com/package/ajv#data-reference

$数据参考

有了可以使用从经验证的数据作为模式的关键字值的值V5选。有关更多信息,请参阅v5提案。

$数据参考中的关键字被支撑:常数,枚举格式,最大/最小,exclusiveMaximum/exclusiveMinimum,最大长度/的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: '[email protected]' 
} 

$数据引用已被安全地解析 - 即使某些属性未定义,它也不会抛出。如果$ data解析为未定义,则验证成功(不包含常量关键字)。如果$ data解析为不正确的类型(例如最大关键字不是“number”),则验证失败。