在JSON模式中重用模式

时间:2017-06-26 10:22:45

标签: json jsonschema

是否可以定义一次正则表达式并重新使用它?我有一些相当复杂的正则表达式,我想将其用作模式中各种不同对象的大量属性的的模式。做复制粘贴看起来就像在线下进一步要求麻烦,但我似乎无法在任何地方找到合适的重复使用示例。

缩减架构,说明我想做什么。

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "patterns": {
    "fqdn_or_ipaddress": "(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\\.)+[a-zA-Z]{2,63}$)||(((?:^[0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])$)|(^\\*$))",
  },
  "properties": {
    "server_hostname" : {
       "type":"string",
       "pattern": {"#ref", "#/patterns/address"},
    },
    "proxy_hostname" : {
       "type":"string",
       "pattern": {"#ref", "#/patterns/address"},
    }   
  }
}

此处不验证http://www.jsonschemavalidator.net/,因为“pattern”不是字符串。这是重用的漏洞吗?我看过patternProperties,但这似乎解决了完全不同的用例。

2 个答案:

答案 0 :(得分:1)

您只能$ref架构。你需要做这样的事情。

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "server_hostname" : {
      "$ref": "#/definitions/fqdn_or_ipaddress",
      "description": "The server hostname"
    },
    "proxy_hostname" : {
      "allOf": [{ "$ref": "#/definitions/fqdn_or_ipaddress" }],
      "description": "The proxy hostname"
    }
  },
  "definitions": {
    "fqdn_or_ipaddress": {
      "type": "string",
      "pattern": "(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\\.)+[a-zA-Z]{2,63}$)||(((?:^[0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])$)|(^\\*$))"
    }
  }
}

修改

我添加了两个如何从$ref扩展的示例。在第一个中,您只需添加description即可。它将被忽略,但它不是错误。由于description只是一个元数据关键字,因此这不应该是一个问题。

在第二个示例中,您可以使用allOf打包$ref,并且可以添加所需的任何关键字(甚至是非元数据关键字)。

答案 1 :(得分:1)

This answer突出显示了用于重用已定义模式的键结构。但是,该示例未验证为:

  1. 该定义是对象定义的一部分,带有“ definitions”,而“ $ ref”路径引用的是“ patterns”定义,在任何地方都找不到。
  2. 模式定义键提供为“ fqdn_or_ipaddress”,而属性中的路径引用的是未定义的“ fqn_or_ipaddress”。

以下是在JSON schema validator中通过验证的更正样本:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "server_hostname" : {
      "$ref": "#/definitions/fqdn_or_ipaddress",
      "description": "The server hostname"
    },
    "proxy_hostname" : {
      "allOf": [{ "$ref": "#/definitions/fqdn_or_ipaddress" }],
      "description": "The proxy hostname"
    }
  },
  "definitions": {
    "fqdn_or_ipaddress": {
      "type": "string",
      "fqdn_or_ipaddress": "(?=^.{4,253}$)(^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\\.)+[a-zA-Z]{2,63}$)||(((?:^[0-9])(?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))(?![0-9])$)|(^\\*$))"
    }
  }
}