【问题标题】:Restrict JSON values to the names of other JSON objects将 JSON 值限制为其他 JSON 对象的名称
【发布时间】:2017-02-24 21:42:13
【问题描述】:

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

我想验证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:

项目1,项目2,项目A,项目B,项目C

和组:

组 1: 项目1、项目B、项目C

组 2: 项目1,项目2,项目Z

Group2 会引发违规,因为它包含未在 TrackedItems 中定义的项目。

【问题讨论】:

    标签: json json.net jsonschema


    【解决方案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 和超链接来这样做有些固执己见。

    【讨论】:

    • 谢谢,经过更多研究,我发现架构不适用于此。相反,我创建了一个单元测试来在代码中执行此验证。谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-02
    • 2017-08-02
    • 2013-09-08
    • 2012-06-09
    • 1970-01-01
    相关资源
    最近更新 更多