【问题标题】:How to specify a property as null or a reference?如何将属性指定为 null 或引用?
【发布时间】:2014-07-06 22:54:30
【问题描述】:

我有一个 json 文档,其中的一部分可以是 null 也可以是子对象,如下所示:

[{
    "owner":null    
},
{
    "owner":{
        "id":1
    }   
}]

问题是是否可以使用 ref 在 json 模式草案 v4 中对此进行建模?

我想要的是这样的

{
    "type":"object",
    "properties":{
        "owner":{
            "type":["null", "object"],
            "$ref":"#/definitions/id"
        }
    },
    "definitions":{
        "id":{
            "type":"object",
            "properties":{
                "id":{
                    "type":"number"
                }
            }
        } 
    }
}

【问题讨论】:

    标签: jsonschema


    【解决方案1】:

    如果您从定义中删除 "type":"object",您发布的内容应该可以工作。

    但是,指定替代项的更简洁、更明确的方法是使用oneOf。您可以保持"id" 定义不变,只需使用:

        "owner":{
            "oneOf": [
                {"type": "null"},
                {"$ref":"#/definitions/id"}
            ]
        }
    

    【讨论】:

    • 注意:oneOf 关键字是在OpenAPI 3.0 中引入的,在 OpenAPI/Swagger 2.0 中不可用。 OpenAPI 2.0 中不支持“null”,请参阅此SO answer
    • @Demitri 是的,但这个问题是关于 JSON Schema 本身,而不是它的 OpenAPI 风格。
    • @Helen Fair 点;当我调查一个问题时,我有隧道视野。鉴于重叠,希望评论对某人有所帮助。
    【解决方案2】:

    nullable 字段将在 OpenApi(又名 Swagger)规范 v3.0.0 中得到支持

    因此,有了这个新规范,您的定义将如下所示:

    "properties":{
        "owner":{
            "nullable": true,
             ...
        }
    },
    

    【讨论】:

      【解决方案3】:

      我建议使用:

      "owner": {
        "nullable": true,
        "allOf": [{ "$ref":"#/definitions/id" }]
      }
      

      在 ReDoc 中你会看到比漂亮:

      使用不支持的{"type": "null"}oneOf 代替(object) or any


      甚至更好 - 创建一个新的可为空的 id 类型:{ "$ref":"#/definitions/id-nullable" }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-01
        • 2013-05-20
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 2018-09-01
        • 1970-01-01
        相关资源
        最近更新 更多