我想使用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:无法解决 架构参考 '#/属性/ TrackedItems /项/属性/ TrackedItemName'
对于数据示例,如果我有TrackedItems:
Item1,Item2,ItemA,ItemB,ItemC
和小组:
组别1: Item1,ItemB,ItemC
组2: Item1,Item2,ItemZ
Group2会抛出违规,因为它包含未在TrackedItems中定义的项目。
答案 0 :(得分:1)
作为验证的词汇表(以及由琐碎的断言描述的某些其他内容),JSON Schema不提供验证数据的一致性的方法。
验证意味着断言,例如"验证X是字符串。"
一致性意味着"确认X是现有活跃用户的ID。"
由于被比较的数据可能完全在另一个数据库中,并且由于这些类型的断言非常重要,因此JSON Schema会验证数据与应用程序和/或其他技术的一致性。某些实现具有针对文档内部比较的特定于供应商的扩展,但是这些扩展不是标准化的,并且我不知道任何可以在这里工作的扩展。
$ref
引用在这里不起作用,因为它只是一种通过引用替换另一个模式的方法。如果你能设法获得工作的参考(我不确定你为什么会收到错误,这是特定于实现的细节),这个架构:
{ "oneOf": [
{"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"}
] }
与说完全相同:
{ "oneOf": [
{"type": "string"}
] }
由于您要求"验证以下一个陈述中的一个是否为真",这也与以下内容相同:
{"type": "string"}
这并不是说你不能使用JSON Schema在JSON中声明数据之间的关系,但是JSON Schema对使用URI和超链接这样做有所了解。