是否有一个属性使用JSON Schema在另一个数组属性中定义类型?

时间:2019-02-15 01:56:41

标签: jsonschema

给出此示例JSON:

{
  "type": "number",
  "values": [ 34, 42, 99 ]
}

是否可以定义JSON模式,以确保 values数组是另一个属性中指定的类型(在本示例中为type)?

type上方的内容是数组values只能包含整数(使用说明符“数字”)。

或指定values包含字符串:

{
  "type": "string",
  "values": [ "hello", "world" ]
}

2 个答案:

答案 0 :(得分:0)

是的,您可以使用“ items”关键字。如果它只有一个值,那么该值就是数组中每个元素的架构。

{
    "type": "array",
    "items": { "type: "string" }
}

假设您像大多数人一样使用草稿4模式,the specification的8.2.3.1节指出:

  

8.2.3.1。如果“ items”是模式

     

如果items是架构,则子实例必须对     此架构,无论其索引如何,以及其值如何     “ additionalItems”。

答案 1 :(得分:0)

是的,但是您必须为每种要支持的类型编写一个if/then块。

理解JSON模式中有一个关于if/then/else的部分:http://json-schema.org/understanding-json-schema/reference/conditionals.html

以下是摘录,解释了if/then/else的工作原理。

  

例如,假设您要编写一个架构来处理   美国和加拿大的地址。这些国家有   不同的邮政编码格式,我们想选择哪种格式   根据国家/地区进行验证。如果地址在美国   州,postal_code字段是一个“邮政编码”:五个数字   然后是可选的四位数后缀。如果地址在   加拿大,postal_code字段是一个六位数的字母数字字符串,其中   字母和数字交替显示。

{
  "type": "object",
  "properties": {
    "street_address": {
      "type": "string"
    },
    "country": {
      "enum": ["United States of America", "Canada"]
    }
  },
  "if": {
    "properties": { "country": { "const": "United States of America" } }
  },
  "then": {
    "properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }
  },
  "else": {
    "properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }
  }
}

对于每种要支持的类型,您都需要编写if/then对象,并将它们全部包装在allOf中。