首页 > 解决方案 > JSON 模式可以在对象或数组中指定所需的属性吗?

问题描述

我很难理解是否可以编写一个需要某些属性的 json 模式,但也允许这些属性位于 json 文件的不同区域(例如,属性值可以在主顶级对象中,或者它可以是在一个数组中 - 它只需要在某个地方)。

例如,我有一些设备会在几个小时内收集多个温度记录并分批发送记录。但是,一些设备在主对象中发送一次软件版本,而另一些设备将软件版本与每个小时的温度记录一起发送(在“记录”数组中)。

示例 1swversion在主对象中发送一次):

{
    "name": "device1",
    "swversion": "1.3.abc2",
    "records": [
        {
            "time": "10am",
            "temp": 2
        },
        {
            "time": "11am",
            "temp": 4
        }
    ]
}

示例 2swversion在“记录”数组中发送):

{
    "name": "device1",
    "records": [
        {
            "time": "10am",
            "temp": 2,
            "swversion": "1.3.abc2"
        },
        {
            "time": "11am",
            "temp": 4,
            "swversion": "1.3.abc2"
        }
    ]
}

使用这些示例,我想将我的模式定义编写如下(前两个项目符号很简单,最后一个项目符号是我正在努力的地方):

我在 json-schema 中是否缺少强制执行所需属性的功能,但只要它们存在于某处,就可以灵活地将所述属性放在任何地方(例如,在对象或数组中)?

标签: jsonjsonschemajson-schema-validator

解决方案


是否有一个功能..允许所述属性的灵活性在任何地方

不直接,但表达这一点并不难。您可以在通过引用重复使用的定义中定义“swversion”本身的结构。

在伪代码中,这将是:

任何:

  • 主对象包含一个“swversion”属性,
  • “记录”下的所有项目都包含“swversion”属性

在代码中:

{
  "$defs": {
    "swversion": {
      "type": "string",
      .. other constraints?
    }
  },
  "type": "object",
  "properties": {
    ... other property definitions ...,
    "records": {
      "items": {
         "type": "object",
         ... other definitions for the mandatory portion of records ...
      }
    }
  },
  "anyOf": [
    {
      "$comment": "swversion is a member of the main object",
      "required": [ "swversion" ],
      "properties": {
        "swversion": {
          "$ref": "#/$defs/swversion"
       }
    },
    {
      "$comment": "swversion is a member of all the items under the records property",
      "properties": {
        "records": {
          "items": {
            "type": "object",
            "required": [ "swversion" ],
            "properties": {
              "swversion": {
                "$ref": "#/$defs/swversion"
             }
           }
         }
        }
      }
    }
  ],
}

请注意,如果您使用的是 JSON Schema 版本 Draft7 或更早版本,请更改$defsdefinitions.


推荐阅读