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

时间:2017-02-24 21:42:13

标签: json json.net jsonschema

我想使用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中定义的项目。

1 个答案:

答案 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和超链接这样做有所了解。