将JSON值限制为其他JSON对象的名称 [英] Restrict JSON values to the names of other JSON objects
问题描述
我想使用JSON模式来验证一些值。我有两个对象,分别称为TrackedItems和TrackedItemGroups。TrackedItemGroups是一个组名和一组TrackedItems名称。例如,该架构类似于:
"TrackedItems": {
"type": "array",
"items": {
"type": "object",
"properties": {
"TrackedItemName": { "type": "string" },
"Properties": { ---- }
}
}
},
"TrackedItemGroups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"GroupName": {
"type": "string"
},
"TrackedItems": {
"type": "array",
"items": {"type": "string"}
}
}
}
}
我要验证TrackedItemGroups
的TrackedItems
数组中的每个字符串都是TrackedItems.TrackedItemName
中定义的名称。
这类似于使用enum
属性来限制值,但enum
列表是基于TrackedITems.TrackedItemName
中的值生成的。
如何编写使用JSON自己的数据进行验证的架构?
我知道我可以四处移动东西,即TrackedItems定义它们所在的组,但有数百个被跟踪的条目,这种组织方式更适合我的用例。
我试过了:
"TrackedItems": {
"type": "array",
"items": {
"oneOf": [
{"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"}
]
}
}
但这会导致错误:
Newtonsoft.Json.Schema.JSchemaReaderException:无法解析 架构引用 ‘#/properties/TrackedItems/items/properties/TrackedItemName’.
对于数据示例,如果我有TrackedItems:
Item1、Item2、ItemA、ItemB、ItemC
和组:
组1: 项目1、项目B、项目C 组2: 项目1、项目2、项目Zgroup2将引发违规,因为它包含未在TrackedItems中定义的项。
推荐答案
作为验证(以及简单断言所描述的某些其他内容)的词汇表,JSON架构不提供验证数据一致性的方法。
验证意味着类似"验证X是否为字符串"的断言。
一致性意味着"验证X是否为现有活动用户的ID"。
由于要比较的数据可能完全在另一个数据库中,并且这些类型的断言不是微不足道的,因此JSON模式将验证数据的一致性留给了应用程序和/或其他技术。有些实现具有特定于供应商的扩展,用于文档内比较,但是这些扩展不是标准化的,我不知道有什么可以在这里工作的。$ref
引用在这里不起作用,因为它只是通过引用替换另一个模式的一种方式。如果您可以设法使引用正常工作(我不确定为什么会出现错误,这是特定于实现的详细信息),则此架构:
{ "oneOf": [
{"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"}
] }
完全等同于说:
{ "oneOf": [
{"type": "string"}
] }
由于您询问的是"验证以下语句之一是否为真",因此这也等同于简单地:
{"type": "string"}
这并不是说您不能使用JSON架构声明JSON中的数据之间的关系,但JSON架构对使用URI和超链接来这样做有些固执己见。
这篇关于将JSON值限制为其他JSON对象的名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!