将JSON值限制为其他JSON对象的名称 [英] Restrict JSON values to the names of other JSON objects

查看:8
本文介绍了将JSON值限制为其他JSON对象的名称的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Item1、Item2、ItemA、ItemB、ItemC

和组:

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

组2: 项目1、项目2、项目Z

group2将引发违规,因为它包含未在TrackedItems中定义的项。

推荐答案

作为验证(以及简单断言所描述的某些其他内容)的词汇表,JSON架构不提供验证数据一致性的方法。

验证意味着类似"验证X是否为字符串"的断言。

一致性意味着"验证X是否为现有活动用户的ID"。

由于要比较的数据可能完全在另一个数据库中,并且这些类型的断言不是微不足道的,因此JSON模式将验证数据的一致性留给了应用程序和/或其他技术。有些实现具有特定于供应商的扩展,用于文档内比较,但是这些扩展不是标准化的,我不知道有什么可以在这里工作的。


$ref引用在这里不起作用,因为它只是通过引用替换另一个模式的一种方式。如果您可以设法使引用正常工作(我不确定为什么会出现错误,这是特定于实现的详细信息),则此架构:

{ "oneOf": [
    {"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"}
] }

完全等同于说:

{ "oneOf": [
    {"type": "string"}
] }

由于您询问的是"验证以下语句之一是否为真",因此这也等同于简单地:

{"type": "string"}

这并不是说您不能使用JSON架构声明JSON中的数据之间的关系,但JSON架构对使用URI和超链接来这样做有些固执己见。

这篇关于将JSON值限制为其他JSON对象的名称的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆