【问题标题】:Use object keys as type in JSON Schema在 JSON Schema 中使用对象键作为类型
【发布时间】:2019-12-24 16:12:05
【问题描述】:

假设我想根据 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

所以属性名称可以是任何字符串,但依赖项只能是根对象的键/属性名称。理想情况下,我会指定一个枚举,但这个问题表明这是不可能的Use object property keys as enum in JSON schema(除非答案已过时)。

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

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

【问题讨论】:

    标签: json intellij-idea yaml jsonschema


    【解决方案1】:

    架构本身没有任何内容可以指示数据的可能值。实际上并不要求 required 数组中的项也必须在属性中定义。

    此类功能仅由 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 在显示时会转义 HTML 字符 文档弹出窗口中 JSON 模式定义的文档。到 获得具有丰富 HTML 标记的漂亮文档,存储 HTML x-intellij-html-description 扩展属性中的描述 而不是描述。

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

    然而,

    根据其他属性的键自动完成

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

    【讨论】:

    • 感谢@Relequestual,我知道所有这些,但给定架构json-schema.org/draft-07/schema# 的Intellij 仍然以某种方式知道如何自动完成所需的数组。所以必须有一些关于那个特定模式的东西可以实现这一点。似乎应该有一种方法可以在我的模式中利用这一点来实现自动完成,即使它不能用于验证。
    • 我敢打赌,这是他们为实现这一目标而编写的自定义代码。 required 不是同一类关键字,因为 required 是字符串数组,而 dependencies 是值是模式的对象。
    • 架构本身没有任何指示。实际上并不要求required 数组中的项也必须在properties 中定义。
    • 谢谢,您能否在最后一个 cmets 实际回答问题时更新您的答案?我会接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 2020-04-02
    • 2015-11-22
    • 2022-01-17
    相关资源
    最近更新 更多