JSON 架构 propertyNames 似乎不起作用

问题描述 投票:0回答:1

我正在尝试使用模式来验证离子 Web 应用程序中的某些输入数据。但它似乎并没有按照我想要的方式工作。此处的架构和示例输入数据:https://www.jsonschemavalidator.net/s/ukPB5SkA.

具体来说,应该允许对象包含属性“页眉”“页脚”“颜色”和“字体”。尽管 extraProperties 设置为 false,但其他属性似乎是允许的。

我也厌倦了添加:

    "patternProperties": {
        ".*": "string"
    }

我在我的项目中使用ajv,所以我尝试使用一种格式:

import addFormats from 'ajv-formats';
import Ajv2019 from "ajv/dist/2019"
const ajv = new Ajv2019({strict: true, removeAdditional: 'all',  allowUnionTypes: true, passContext: true})
addFormats(ajv)
ajv.addFormat("collection", {
  type: "string",
  validate: (x) => Object.keys(Properties).includes(x)
})

enum Properties {
  'header',
  'footer',
  'color',
  'typeface'
}

const complexSchemaFormat = {
  "type": "object",
  "properties": {
    "propertyNames": {
      "type": "string",
      "format": "collection"
    },
    "additionalProperties": false
  }
} as const

    const complexInput2 = {
      "jiii": 2,
      "juuu": "laal"
    }
  protected doThing() {
    const complexIsValid3 = ajv.validate(complexSchemaFormat,complexInput2)
    console.log(complexIsValid3) // is true, should be false
    }
typescript jsonschema ajv
1个回答
0
投票

propertyNames
是与
properties
类似的涂抹器。 规范的官方描述指出:

propertyNames 关键字用于定义对象实例中属性名称的约束。它允许您指定对象实例中的所有属性名称都必须遵守的架构。

您编写架构的方式,定义的实际属性名称是

propertyNames

{
  "propertyNames": "something"
}

它应该是这样的,您希望将命名限制为您的枚举。但是,这并不能让您限制这些属性的values

{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"propertyNames": {
   "pattern": "header|footer|color|typeface"
  }
}

您可能真的想做这样的事情,甚至不需要定义自定义

format
。 JSON 模式验证将验证您尝试使用以下自定义格式执行的操作

{
  "$schema": "https://json-schema.org/draft/2019-09/schema",
  "unevaluatedProperties": false,
  "patternProperties": {
    "header|footer|color|typeface": {
      "type": "string"
    }
  }
}

这基本上是说,此模式中定义的任何属性都必须是

patternProperties
中的值之一,然后它必须验证为
string

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.