尝试让JSON模式规范的示例元模式工作

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

我正在尝试使用JSON Schema规范中的元模式示例。
我将新的主元模式放入一个名为new-main-meta-schema.json的文件中

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.com/meta/general-use-example",
  "$dynamicAnchor": "meta",
  "$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/validation": true,
    "https://example.com/vocab/example-vocab": true
  },
  "allOf": [
    {"$ref": "https://json-schema.org/draft/2020-12/meta/core"},
    {"$ref": "https://json-schema.org/draft/2020-12/meta/applicator"},
    {"$ref": "https://json-schema.org/draft/2020-12/meta/validation"},
    {"$ref": "https://example.com/meta/example-vocab"}
  ],
  "patternProperties": {
    "^unevaluated": false
  },
  "properties": {
    "localKeyword": {
      "$comment": "Not in vocabulary, but validated if used",
      "type": "string"
    }
  }
}

字符串
该元模式引用新的扩展模式。我把它放到一个名为**extension-schema.json的文件中

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://example.com/meta/example-vocab",
  "$dynamicAnchor": "meta",
  "$vocabulary": {
    "https://example.com/vocab/example-vocab": true
  },
  "type": ["object", "boolean"],
  "properties": {
    "minDate": {
      "type": "string",
      "pattern": "[0-9]{4}-[0-9]{2}-[0-9]{2}",
      "format": "date"
    }
  }
}


现在我创建了一个符合新的元模式的模式。我将模式放入名为schema.json的文件中

{
    "$schema": "https://example.com/meta/general-use-example",
    "type": "object",
    "properties": {
        "departingGate": {"type": "string"},
        "minDate": "2023-08-07"
    }
}


然后我创建了一个模式的示例。我将示例放入一个名为instance.json的文件中

{
   "departingGate": "Gate 26"
}


看起来都对吗?
接下来,我想根据schema.json验证instance.json,所以我打开浏览器到online JSON Schema validator tool Hyperjump。我将new-main-meta-schema.json的内容复制到在线工具的schema部分。该工具立即响应此错误消息:

Error: Unrecognized vocabulary: https://example.com/vocab/example-vocab. You can define this vocabulary with the 'defineVocabulary' function.


有没有办法在Hyperjump的在线模式验证器中运行这个例子?如果没有,是否有一个在线模式验证器可以运行这个示例?

gg58donl

gg58donl1#

有没有办法在Hyperjump的在线模式验证器中运行这个例子?
做了一些调整,是的。定义自定义方言的某些部分需要代码。任何需要代码的事情都不能在在线工具中完成。
您的示例创建了一个名为minDate的自定义关键字。为了让验证器知道如何计算该关键字,您需要在JavaScript(或TypeScript)中提供一个关键字实现。您不能在线提供代码,但是如果您的关键字只是一个注解(始终验证为true),您可以将关键字的词汇表设置为可选,从而避免编写代码。
下面是你如何使词汇成为可选的。

"$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/validation": true,
    "https://example.com/vocab/example-vocab": false // <-- This changed to false
  },

字符串
它也在词汇元模式中。实际上没有理由在这里使用$vocabulary,所以只需要删除它。

// Delete these lines
  "$vocabulary": {
    "https://example.com/vocab/example-vocab": true
  },


现在它将在在线验证器中工作。如果您还没有弄清楚,可以使用[+]按钮向模式面板添加附加选项卡。第一个选项卡始终是入口点。这就是您创建的模式将去的地方。方言元模式和词汇表元模式将位于您打开的“模式2”和“模式3”选项卡中。警告:为了避免错误,请在将模式粘贴到主模式选项卡之前先添加元模式。
此时,您将得到无效模式错误,因为您的模式无效。我想你是说这个

"departureDate": { "minDate": "2023-08-07" } // <-- The `minDate` keyword needed to be inside a schema

相关问题