JSON 模式可以指定跨域约束吗?
Can JSON schemas specify cross-field constraints?
假设我有一个简单的联系人数据库,其中包含 "Last Called" 历史记录,以 JSON 格式存储:
{
"contacts": [
{"id": 10001, "name": "Fred"},
{"id": 10006, "name": "Helen"},
{"id": 10009, "name": "John"},
{"id": 10030, "name": "Tara"},
{"id": 10101, "name": "Jason"}
],
"history": [
{"id": 10006, "time": 1513567986},
{"id": 10001, "time": 1513567243},
{"id": 10101, "time": 1513566511},
{"id": 10030, "time": 1513565012},
{"id": 10006, "time": 1513562390}
]
}
我想彻底验证一下。指定整体结构(例如确保每个 contact
都有一个数字 id
和一个字符串 name
)和值限制(例如 id
是 10000 和 99999 之间的数字) 很简单。但是,我想实施更复杂的检查,例如:
- 每个
contacts
对象都有一个唯一的 id
值
- 每个
history
对象的 id
值匹配一个 contact
's `id' 值
可以使用 JSON schema 指定这些约束吗? (请注意,解决方案不应该依赖于结构中彼此相对接近的两个 id
字段;在一个完整的应用程序中,它们可能各自在不同的值树中有几层深。)
AFAIK,您不能使用 JSON 架构执行此操作。您可以检查数组中的唯一项,但不能检查对象值。
您可能已经想到了这一点,选择是遍历对象键并手动验证它。例如,您可以将 id
添加到一个集合中,然后比较集合大小和数组长度。
假设我有一个简单的联系人数据库,其中包含 "Last Called" 历史记录,以 JSON 格式存储:
{
"contacts": [
{"id": 10001, "name": "Fred"},
{"id": 10006, "name": "Helen"},
{"id": 10009, "name": "John"},
{"id": 10030, "name": "Tara"},
{"id": 10101, "name": "Jason"}
],
"history": [
{"id": 10006, "time": 1513567986},
{"id": 10001, "time": 1513567243},
{"id": 10101, "time": 1513566511},
{"id": 10030, "time": 1513565012},
{"id": 10006, "time": 1513562390}
]
}
我想彻底验证一下。指定整体结构(例如确保每个 contact
都有一个数字 id
和一个字符串 name
)和值限制(例如 id
是 10000 和 99999 之间的数字) 很简单。但是,我想实施更复杂的检查,例如:
- 每个
contacts
对象都有一个唯一的id
值 - 每个
history
对象的id
值匹配一个contact
's `id' 值
可以使用 JSON schema 指定这些约束吗? (请注意,解决方案不应该依赖于结构中彼此相对接近的两个 id
字段;在一个完整的应用程序中,它们可能各自在不同的值树中有几层深。)
AFAIK,您不能使用 JSON 架构执行此操作。您可以检查数组中的唯一项,但不能检查对象值。
您可能已经想到了这一点,选择是遍历对象键并手动验证它。例如,您可以将 id
添加到一个集合中,然后比较集合大小和数组长度。