【问题标题】:Reuse pattern in JSON schemaJSON 模式中的重用模式
【发布时间】:2017-06-26 10:22:44
【问题描述】:

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

削减说明我想要做什么的架构。

{
  "$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/,因为“模式”不是字符串。难道这是一个洞在重用。我看过 patternProperties,但这似乎解决了完全不同的用例。

【问题讨论】:

    标签: json jsonschema


    【解决方案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,并且可以添加您需要的任何关键字(甚至是非元数据关键字)。

    【讨论】:

    • 太棒了。谢谢,如果我不必为每个属性添加描述,那将起作用。有没有一种“扩展”模式的方法? “属性”:{“服务器主机名”:{“$ref”:“#/patterns/fqn_or_ipaddress”,“描述”:“bla bla bla”},
    • @smcp 我更新了答案以解决您的问题。
    • 这正是我想要的
    • 查看下一个正确命名的答案
    • 我修正了错别字(包括另外一个未识别的错别字)。犯了这么多错误,我一定很累了。
    【解决方案2】:

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

    1. 定义是作为对象引用的一部分给出的,带有“定义”,而“$ref”路径引用了一个找不到的“模式”定义。
    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])$)|(^\\*$))"
        }
      }
    }
    

    【讨论】:

    • 下次考虑使用“编辑”功能,而不是创建一个新的答案来修正错别字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    相关资源
    最近更新 更多