将JSON值限制为其他JSON对象的名称



我想使用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"}
      }
    }
  }
}

我想验证TrackedItemGroupsTrackedItems数组中的每个字符串都是在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上有点有些看法。

相关内容

  • 没有找到相关文章

最新更新