我有以下架构:
const LIST_EVENTS = {
"id": "/listEvents",
"type": "object",
"properties": {
"filter": {
"$ref": "/MarketFilter",
"required": true
},
"locale": {
"type": "string"
}
}
}
从调试中,我可以看到发送到验证的对象是:
{
marketFilter: {
eventTypeIds: [ '1' ],
marketStartTime: {
from: '2018-12-15T00:00:00+00:00',
to: '2018-12-15T23:59:59+00:00'
}
}
}
marketFilter
与架构中filter
的名称不匹配。据我了解,鉴于这是必填属性,因此应该在验证结果的errors
数组中将其标记出来,但事实并非如此。这是我的验证结果:
ValidatorResult {
instance:
{ marketFilter: { eventTypeIds: [Array], marketStartTime: [Object] } },
schema:
{ id: '/listEvents',
type: 'object',
properties: { filter: [Object], locale: [Object] } },
propertyPath: 'instance',
errors: [],
throwError: undefined,
disableFormat: false }
我认为它可能不介意命名约定,因此我完全删除了该属性,但仍然没有记录错误,这是验证结果:
ValidatorResult {
instance: {},
schema:
{ id: '/listEvents',
type: 'object',
properties: { filter: [Object], locale: [Object] } },
propertyPath: 'instance',
errors: [],
throwError: undefined,
disableFormat: false }
我有很多模式,它们都是通过.addSchema
方法添加的
答案 0 :(得分:0)
就目前而言,我已经找到了一种解决方法,文档中也对此进行了描述。我已经向架构添加了required
数组属性,并向其添加了filter
。现在,这引发了错误。
但是,文档指出该属性本身上的required
属性应该可以正常工作。这可能是软件包的问题吗?如果该属性是引用,是否有其他行为?
答案 1 :(得分:0)
您的架构有两个问题。主要问题是您的required
关键字被忽略,因为它位于$ref
旁边。当遇到带有$ref
关键字的对象时,需要一个模式,该对象仅被视为JSON参考。它不被视为架构。 JSON参考仅具有$ref
关键字的语义。其他所有内容都将被忽略。您可以通过在架构中隔离$ref
来解决问题。
"filter": {
"allOf": [{ "$ref": "/MarketFilter" }],
"required": true
}
另一个问题是使用required
关键字的布尔形式。 required
关键字的这种用法在几年前已从JSON Schema规范中删除。除非您专门针对draft-03规范编写JSON Schema(除非它已经过时了),否则您应该使用required
的数组形式。一些较旧的实现允许您同时使用两种形式,但这不是一个好主意。您应该以单一规范为目标,并且不要混用来自两个不同规范版本的关键字。
{
"id": "/listEvents",
"type": "object",
"properties": {
"filter": {
"$ref": "/MarketFilter"
},
"locale": {
"type": "string"
}
},
"required": ["filter"]
}