【问题标题】:Schema for JSON object with an array of items of the same type when this type is different in different objects当此类型在不同对象中不同时,具有相同类型项目数组的 JSON 对象的模式
【发布时间】:2015-09-04 05:36:19
【问题描述】:

我想描述一个具有数组类型属性的对象的模式。该数组中的项目必须属于同一类型。但是对于该数组中的项目,两个不同的对象可以有不同的类型:

// object_1
{
  <...>,
  "array_of_some_type": [1, 2, 3, 4, 5],
  <...>
}

// object_2
{
  <...>,
  "array_of_some_type": ["one", "two", "three"],
  <...>
}

我试过使用oneOf关键字:

{
  "type": "object",
  "properties": {
    <...>
    "array_of_some_type": {
      "type": "array",
      "minItems": 1,
      "uniqueItems": true,
      "items": {
        "oneOf": [
          { "type": "number" },
          { "type": "string" },
          { "type": "object" }
        ]
      },
      "additionalItems": false
    },
    <...>
  },
  "required": [ "array_of_some_type" ],
  "additionalProperties": false
}

但这是错误的,因为此架构在我的案例对象中无效:

// invalid_object
{
  <...>,
  "array_of_some_type": [1, "two", 3],
  <...>
}

正确的架构可能如下所示:

{
  "type": "object",
  "properties": {
    <...>
    "array_of_some_type": {
      "oneOf": [
        {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": { "type": "number" },
          "additionalItems": false
        },
        {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": { "type": "string" },
          "additionalItems": false
        },
        {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": { "type": "object" },
          "additionalItems": false
        }
      ]
    },
    <...>
  },
  "required": [ "array_of_some_type" ],
  "additionalProperties": false
}

但是有很多相同数组属性的重复项。 有没有办法调整第二个模式以避免重复?或者有什么其他建议?

【问题讨论】:

    标签: json jsonschema


    【解决方案1】:

    您只能将变化的部分放在oneOf 子句中。我认为 JSON-Schema 必须支持 Java 的泛型之类的东西才能更简洁地表达这一点。

    {
      "type": "object",
      "properties": {
        "array_of_some_type": {
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "oneOf": [
            { "items": { "type": "number" } },
            { "items": { "type": "string" } },
            { "items": { "type": "object" } }
          ]
        }
      },
      "required": [ "array_of_some_type" ],
      "additionalProperties": false
    }
    

    【讨论】:

    • 在大多数情况下最好使用 anyOf - 在大多数实现中它会更快地验证。 oneOf 仅在只有一个选项有效时才有效,因此验证器必须验证所有选项。如果任何选项有效,则 anyOf 是有效的,因此一旦验证器找到有效的选项,它就会停止。
    • @esp,好点。 oneOfanyOf 在这种情况下都可以工作,anyOf 的验证性能会更好。
    • 但是带有oneOf 的模式将验证像{ "array_of_some_type": [1, "two", 3] } 这样的对象,这在我的情况下是无效的。还是我错了?这就是为什么我用anyOf 制作了一个架构,但它有很多重复项。所以我正在寻找一种解决方案,它只会验证正确的对象并且不会有太多重复。
    • @OlegCh,试试看,你会发现我提出的模式可以满足你的需求。您的示例将无法使用此架构进行验证。尝试使用anyOfoneOf。您会看到它们的工作原理完全相同。
    • @Jason,你是对的!那是我对oneOf 验证如何工作的误解。那么,如果在数组定义中指定了oneOfanyOf,那么它将为第一个元素选择一次,然后应用于所有其他项?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多