json - JSON 模式可以在对象或数组中指定所需的属性吗?
问题描述
我很难理解是否可以编写一个需要某些属性的 json 模式,但也允许这些属性位于 json 文件的不同区域(例如,属性值可以在主顶级对象中,或者它可以是在一个数组中 - 它只需要在某个地方)。
例如,我有一些设备会在几个小时内收集多个温度记录并分批发送记录。但是,一些设备在主对象中发送一次软件版本,而另一些设备将软件版本与每个小时的温度记录一起发送(在“记录”数组中)。
示例 1(swversion
在主对象中发送一次):
{
"name": "device1",
"swversion": "1.3.abc2",
"records": [
{
"time": "10am",
"temp": 2
},
{
"time": "11am",
"temp": 4
}
]
}
示例 2(swversion
在“记录”数组中发送):
{
"name": "device1",
"records": [
{
"time": "10am",
"temp": 2,
"swversion": "1.3.abc2"
},
{
"time": "11am",
"temp": 4,
"swversion": "1.3.abc2"
}
]
}
使用这些示例,我想将我的模式定义编写如下(前两个项目符号很简单,最后一个项目符号是我正在努力的地方):
- 主要对象需要
name
属性和records
数组 records
数组可以包含需要time
和temp
需要的对象swversion
某处需要(可能在主对象或records
数组内部)
我在 json-schema 中是否缺少强制执行所需属性的功能,但只要它们存在于某处,就可以灵活地将所述属性放在任何地方(例如,在对象或数组中)?
解决方案
是否有一个功能..允许所述属性的灵活性在任何地方
不直接,但表达这一点并不难。您可以在通过引用重复使用的定义中定义“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 或更早版本,请更改$defs
为definitions
.
推荐阅读
- api - 使用 Sitecore JSS 的 API 安全性
- sql-server - 如何在 between 子句中使用 varchar 日期字段 - SQL Server 2012
- java - RmiRegistry 在运行单元测试时创建了多次
- neo4j - 使用 Cypher 通过图的所有有效路径
- php - php说有些结果不是未定义的,而有些是
- phpspreadsheet - 如何更改工作表标题颜色背景?
- azure-devops - 我可以制定 Team Foundation Server 2018 的交付计划吗?
- postgresql - Clojure:带有 postgres 的 jdbc/insert 返回 1 而不是新插入的行
- xtext - 如何使 XTEXT 模板不区分大小写?
- python - Python AES 解密 struct TypeError