Json Schema:声明一个类型的数组或另一个类型

时间:2017-06-26 09:43:40

标签: jsonschema

如何声明一个属性,该属性可以是一个类型的数组,即字符串,或另一个,即整数?我用Google搜索,我发现的只是一种声明混合类型的方式。

我尝试了以下架构定义:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "definitions": {
    "content": {
      "oneOf": [
        {
          "type": "array",
          "items": [
            {
              "type": "string"
            }
          ]
        },
        {
          "type": "array",
          "items": [
            {
              "type": "integer"
            }
          ]
        }
      ]
    }
  },
  "type": "object",
  "properties": {
    "content": {
      "$ref": "#/definitions/content"
    }
  }
}

验证

{
  "content": [
     1, 2
  ]  
}

{
  "content": [
     "a", "b"
  ]  
}

但也验证了

{
  "content": [
     1, "a"
  ]  
}

我应该认为无效。

2 个答案:

答案 0 :(得分:3)

您使用items关键字的错误变体。有一个表单采用模式,另一个表单采用模式数组。

架构变体意味着所有元素必须与架构匹配。以下模式定义了一个数组,其中所有值都是字符串。

{
  "items": { "type": "string" }
}

模式变体数组描述了一个元组。第一个模式验证第一个项目,第二个模式验证第二个项目,依此类推。以下模式验证一个数组,其中第一个项是整数,第二个是字符串,第三个是布尔值。

{
  "items": [
    { "type": "integer" },
    { "type": "string" },
    { "type": "boolean" }
  ]
}

很少需要items的元组变体。你几乎总是想要另一个。

答案 1 :(得分:0)

您的架构按顺序显示。我倾向于认为这将是您使用它来验证[1, "a"]变体的实施中的错误。您是否使用不同的实现对此进行了测试,或者考虑过您在此处尝试的实现提交错误?