如何创建2020-12 JSON Schema元模式草案的方言?

vtwuwzda  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(119)

我想创建一个2020-12元模式草案的方言。我希望方言禁止使用“元数据”元模式中的任何属性(标题、描述、默认值等)。换句话说,我希望从“主”元模式中删除元数据词汇表:

"$vocabulary": {
    ...
    "https://json-schema.org/draft/2020-12/vocab/meta-data": true

字符串
怎么办?创建这种新的元模式方言需要哪些步骤?@Jason Desrosiers写了一个很棒的步骤列表(https://stackoverflow.com/a/63797644/1248535),用于创建draft 04元模式的方言。我猜创建2020-12元模式草案方言的步骤列表是完全不同的。

ve7v8dk2

ve7v8dk21#

实际上在说明书中有一个很好的例子。
从2019-09年开始,我们将元模式分解为几个,每个词汇表一个。首先要做的是删除你不想要的东西。
从2020-12基本元模式开始。

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://json-schema.org/draft/2020-12/schema",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/core": true,
    "https://json-schema.org/draft/2020-12/vocab/applicator": true,
    "https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
    "https://json-schema.org/draft/2020-12/vocab/validation": true,
    "https://json-schema.org/draft/2020-12/vocab/meta-data": true,
    "https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
    "https://json-schema.org/draft/2020-12/vocab/content": true
  },
  "$dynamicAnchor": "meta",

  "title": "Core and Validation specifications meta-schema",
  "allOf": [
    {"$ref": "meta/core"},
    {"$ref": "meta/applicator"},
    {"$ref": "meta/validation"},
    {"$ref": "meta/meta-data"},
    {"$ref": "meta/format-annotation"},
    {"$ref": "meta/content"}
  ],
  "type": ["object", "boolean"]
  // there's some other "deprecated" stuff in here that you likely don't need
}

字符串
您不需要元数据词汇表,因此删除对它的引用。您还应该更改$id,因为这是您的元模式,而不是2020-12元模式草案。

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://your.domain/meta-schema/or/something",
  "$vocabulary": {
    "https://json-schema.org/draft/2020-12/vocab/core": true,
    "https://json-schema.org/draft/2020-12/vocab/applicator": true,
    "https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
    "https://json-schema.org/draft/2020-12/vocab/validation": true,
    "https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
    "https://json-schema.org/draft/2020-12/vocab/content": true
  },
  "$dynamicAnchor": "meta",

  "title": "Core and Validation specifications meta-schema",
  "allOf": [
    {"$ref": "meta/core"},
    {"$ref": "meta/applicator"},
    {"$ref": "meta/validation"},
    {"$ref": "meta/format-annotation"},
    {"$ref": "meta/content"}
  ],
  "type": ["object", "boolean"]
  // there's some other "deprecated" stuff in here that you likely don't need
}


这会删除这些关键字的定义,但不会禁止它们。草案2020-12允许包含未知关键字,因此任何人仍然可以添加title。更重要的是,由于我们已经删除了title的定义,他们可以添加任何他们想要的值:

{
  "title": true
}


根据您的元模式,这将是一个有效的模式。
要禁用这些关键字,您有几个选项。

  • 仅不允许那些特定关键字
  • 禁止所有未知关键字

只禁用这些关键字

你有几个选择,但我认为这可能是最简单的:

{
  // rest of meta-schema
  "properties": {
    "title": false,
    ...
  }
}


它基本上说,这些属性的值都是无效的,实际上要求它们不存在。

禁止所有未知关键字

对于这种方法,您将向元模式添加unevaluatedProperties: false。这将禁止allOf中列出的某个元模式中未定义的任何关键字。

{
  // rest of meta-schema
  "unevaluatedProperties": false
}

相关问题