代码之家  ›  专栏  ›  技术社区  ›  Sasha

将字段的可能值限制为JSON模式中某个人的键

  •  0
  • Sasha  · 技术社区  · 4 年前

    我想使用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 属性来限制值,但 枚举 列表是基于中的值生成的 TrackedITems.TrackedItemName 。

    如何编写模式以使用JSON自己的数据进行验证?

    我知道我可以移动东西,即TrackedItems定义了它们所在的组,但有数百个被跟踪的项目,这个组织更适合我的用例。

    我试过了:

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

    但这会导致一个错误:

    Newtonsoft。Json。架构。JSchemaReaderException:无法解析 架构引用 '#/properties/TrackedItems/items/properties/TrackeItemName'。

    对于一个数据示例,如果我有TrackedItems:

    第1项、第2项、第A项、第B项、第C项

    和组:

    第1组: 第1项、第B项、第C项

    第2组: 第1项、第2项、第Z项

    Group2将引发冲突,因为它包含未在TrackedItems中定义的项。

    0 回复  |  直到 9 年前
        1
  •  1
  •   awwright    9 年前

    成为的词汇 验证 (以及由琐碎断言描述的某些其他事情),JSONSchema没有提供验证 一致性 的数据。

    验证意味着诸如“验证X是一个字符串”之类的断言

    一致性意味着“验证X是现有活动用户的ID”

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


    a. $ref 引用在这里不起作用,因为它只是通过引用在另一个模式中进行替换的一种方式。如果您能够设法使引用正常工作(我不确定为什么会出现错误,这是特定于实现的细节),则此模式:

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

    是完全相同的事情说:

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

    由于您要求“验证以下一个陈述中的一个是真的”,这也与简单地说相同:

    {"type": "string"}
    

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