如何在json模式中定义替代结构

时间:2015-02-26 12:26:35

标签: javascript json jsonschema

我有JSON文件,看起来像这样:

{
    "api": "http://my.api.host",
    "modules": [
        "core", "module", "another"
    ]
}

或者这个:

{
    "api": "http://my.api.host",
    "modules": "*"
}

请注意,modules属性可以包含数组作为其值或*字符串。如何在JSON模式中执行此操作?使用无价的http://jsonschema.net/我创建了以下仅验证数组的结构:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "additionalProperties": true,
  "properties": {
    "api": {
      "id": "http://jsonschema.net/api",
      "type": "string",
      "minLength": 1
    },
    "modules": {
      "id": "http://jsonschema.net/modules",
      "type": "array",
      "minItems": 1,
      "uniqueItems": false,
      "additionalItems": true,
      "items": {
        "id": "http://jsonschema.net/modules/2",
        "type": "string",
        "minLength": 1
      }
    }
  },
  "required": [
    "api",
    "modules"
  ]
}

如何在JSON模式中替代?

1 个答案:

答案 0 :(得分:2)

我找到了答案,基于另一个(略有不同)SO question。解决方案是使用anyOf,它可以定义至少一个必须匹配的备用子模式。我案例的一个示例解决方案是:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "additionalProperties": true,
  "properties": {
    "api": {
      "id": "http://jsonschema.net/api",
      "type": "string",
      "minLength": 1
    },
    "modules": {
      "id": "http://jsonschema.net/modules",
      "anyOf": [{
        "type": "array",
        "minItems": 1,
        "uniqueItems": true,
        "items": {
          "id": "http://jsonschema.net/modules/2",
          "type": "string",
          "minLength": 1
        }
      }, {
        "type": "string",
        "minLength": 1
      }]
    }
  },
  "required": [
    "api",
    "modules"
  ]
}