jsonschema不会因缺少必需属性而抛出错误

时间:2018-12-15 14:01:11

标签: javascript jsonschema

我有以下架构:

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方法添加的

2 个答案:

答案 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"]
}