我想使用JSON模式来验证某些值。我有两个对象,称他们为跟踪eDEDITEMS和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
和组:
group1: item1,itemb,itemc
group2: item1,item2,itemz
group2会违反,因为它包含未在跟踪的项目中定义的项目。
是验证的词汇(以及通过琐碎断言描述的某些其他事项),JSON Schema没有提供验证一致性数据。
验证是指诸如"验证x是字符串"之类的断言。
一致性是指"验证x是现有活跃用户的ID"之类的东西。
由于被比较的数据可能完全在另一个数据库中,而且由于这些断言是非平凡的,因此JSON模式在应用程序和/或其他技术中验证了数据的一致性。某些实施情况具有特定于供应商的扩展,用于内部内存比较,但是这些实现并不标准化,我不知道这里有任何作用。
$ref
参考在这里不起作用,因为这只是通过参考替换另一个模式的一种方式。如果您可以设法获得工作的参考(我不确定您为什么会出错,这是特定于实现的细节),则此模式:
{ "oneOf": [
{"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"}
] }
与说:
完全相同{ "oneOf": [
{"type": "string"}
] }
由于您在问"验证以下一项陈述是真实的",所以这也与简单相同:
{"type": "string"}
这并不是说您无法使用JSON模式在JSON中声明数据之间的关系,但是JSON Schema在使用URIS和Hyperlink上有点有些看法。