gpt4 book ai didi

javascript - jsonschema 不会在缺少必需属性时抛出错误

转载 作者:行者123 更新时间:2023-11-30 19:57:29 25 4
gpt4 key购买 nike

我有以下架构:

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

最佳答案

您的架构有两个问题。主要问题是您的 required 关键字被忽略,因为它位于 $ref 旁边。当在需要模式的地方遇到带有 $ref 关键字的对象时,它仅被视为 JSON 引用。它不被视为模式。 JSON 引用仅具有 $ref 关键字的语义。其他一切都被忽略。您可以通过在架构中隔离 $ref 来解决您的问题。

"filter": {
"allOf": [{ "$ref": "/MarketFilter" }],
"required": true
}

另一个问题是 required 关键字的 bool 形式的使用。 required 关键字的这种用法多年前已从 JSON Schema 规范中删除。除非您专门针对 draft-03 规范编写 JSON 模式(不太可能,它早就过时了),否则您应该使用 required 的数组形式。一些较旧的实现允许您使用这两种形式,但这不是一个好主意。您应该以单一规范为目标,而不是混合使用来自两个不同版本规范的关键字。

{
"id": "/listEvents",
"type": "object",
"properties": {
"filter": {
"$ref": "/MarketFilter"
},
"locale": {
"type": "string"
}
},
"required": ["filter"]
}

关于javascript - jsonschema 不会在缺少必需属性时抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53793889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com