包含条件逻辑的JSON模式

uelo1irk  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(343)

我正在为一个Web应用程序创建一个JSON模式。该模式包含一些compute_parameters,这些compute_parameters将由用户指定,例如将include_direct_transport设置为true或false,并且还包含来自数据库的输入数据,为简单起见,我们称之为dataset1dataset2。现在我还有dataset3dataset4,我也想将它们作为输入数据包含到我的应用程序中,但只有当include_direct_transport设置为true时。做这件事的最佳方法是什么?我想避免冗余,最好是在一个文件中定义所有内容,但如何处理这里的情况?有没有一种方法可以在json中定义:如果include_direct_transport == True,那么也包括dataset3dataset4并验证它们?下面是我的模式的一个小例子

{
"type": "object",
"properties": {
  "metadata": {
    "type": "object",
    "properties": {
      "run_id": {"type": "string", "format": "uuid"},
      ...
    },
    "required": ["run_id"...]
  },
  "compute_parameters": {
    "type": "object",
    "properties": {
      "include_direct_transport": {"type": "boolean"}
    ...
    },
    "required": ["include_direct_transport" ...]
  },
  "input_data": {
    "type": "object",
    "properties": {
      "dataset1": {
        "type": "array"
         ...}
      "dataset2": {
        "type": "array"
         ...}

这就是我现在处理它的方式,但是因为我以前从来没有定义过json模式,所以我不确定什么是最好的方法。我想我正在寻找一些一般性的建议和最佳做法。先谢了

"dependencies": {
  "compute_parameters": {
    "properties": {
      "include_direct_transport": {
        "enum": [true]
      }
    },
    "required": ["dataset3", "dataset4"]
  }
}
nxagd54h

nxagd54h1#

在这种情况下,dependencies关键字并不是您想要的。为了针对属性的 value(而不是属性的 presence)定义条件,您需要if/then关键字。
ifthen是普通模式。如果if模式通过了示例验证,那么then模式也必须通过验证。因此,if定义了一个模式,其中/compute_parameters/include_direct_transport的值是true,而thenAssert/input_data/dataset3/input_data/dataset4存在。

"if": {
    "properties": {
      "compute_parameters": {
        "properties": {
          "include_direct_transport": { "const": true }
        },
        "required": ["include_direct_transport"]
      }
    },
    "required": ["include_direct_transport"]
  },
  "then": {
    "properties": {
      "input_data": { "required": ["dataset3", "dataset4"] }
    },
    "required": ["input_data"]
  }

解决方案有点冗长,但在我看来这是最好的方法。您可以在www.example.com上找到有关这些关键字的更多信息https://json-schema.org/understanding-json-schema/reference/conditionals.html#if-then-else

相关问题