首页 > 解决方案 > 在 JSON Schema 中使用对象键作为类型

问题描述

假设我想根据 Intellij IDEA 中的 JSON 模式验证 YAML 文件。该文件的结构如下:

foo:
  command: touch /tmp/a.txt  # I know I don't need this but it's an example
bar:
  command: echo "Hello World!" > /tmp/a.txt
baz:
  command: cat /tmp/a.txt
  dependencies:
    - foo
    - bar

因此属性名称可以是任何字符串,但依赖项只能是根对象的键/属性名称。理想情况下,我会指定一个枚举,但这个问题表明不可能在 JSON 模式中将对象属性键用作枚举(除非答案已过时)。

不过,我注意到,当您在 Intellij 中编写模式并添加 a"required" = [...]时,它会使用“属性”对象的属性名称自动完成所需字段(即使它不使用它们来验证,但对于我的目的来说足够接近)。我已经检查了它的架构http://json-schema.org/draft-07/schema#但无法理解它是如何做到的。

有没有一种方法可以定义我的架构,以便 Intellij 根据另一个属性的键自动完成,就像定义架构时一样?

标签: jsonintellij-ideayamljsonschema

解决方案


架构本身没有任何内容可以指示数据的可能值。实际上不需要在属性中定义所需数组中的项目。

这种功能仅由 IDE 定义。IntelliJ IDEA 记录了添加自定义模式的能力:

除了来自 JSON Schema Store 的模式之外,IntelliJ IDEA 还允许您配置和使用来自其他存储的自定义模式。您可以下载所需的架构并将其存储在项目根目录下或指定资源的 URL,以便 IntelliJ IDEA 可以自动下载架构。

要配置自定义 JSON 架构:

在设置/首选项对话框 ⌘, 中,转到语言和框架 | 模式和 DTD | JSON 模式映射。

https://www.jetbrains.com/help/idea/json.html#ws_json_schema_add_custom

后面还会详细介绍如何让智能感知提供丰富的预览:

在 JSON 模式中使用 HTML 描述

默认情况下,IntelliJ IDEA 在文档弹出窗口中显示 JSON 模式定义的文档时会转义 HTML 字符。要获得具有丰富 HTML 标记的漂亮文档,请将 HTML 描述存储在 x-intellij-html-description 扩展属性而不是描述中。

https://www.jetbrains.com/help/idea/json.html#ws_json_show_doc_in_html

然而,

基于其他属性键的自动完成

听起来像是专门为编写 JSON Schema 而设计的自定义功能。JSON Schema 本身不能像那样动态地引用数据(我认为这是您的想法)。


推荐阅读