我如何指出哪一个" oneOf" API响应会用吗?

时间:2016-09-20 20:17:46

标签: jsonschema json-api

我有一个API,其中一个键的基本响应将具有一组标识符。用户可以传递一个额外的参数,这样数组就会从一个字符串数组变成一个对象数组(对于实际的细节,而不是必须进行单独的调用)。

"children": {
  "type": "array",
  "items": {
    "oneOf": [{
      "type": "string",
      "description": "Identifier of child"
    }, {
      "type": "object",
      "description": "Contains details about the child"
    }]
  }
},

有没有办法表明第一种类型是默认的,第二种是通过请求的参数?

1 个答案:

答案 0 :(得分:0)

我并不完全清楚你要通过区别来实现什么。真的,这听起来像文件;也许在每个description子模式的oneOf中详细说明。

您可以在顶层添加一个额外的布尔字段(children的兄弟),以指示是否返回详细响应并为该字段提供默认值。下一步是将布尔值与数组项的类型相结合,这是我使用oneOf完成的。

我建议的内容如下:

{                                                                               
  "children": {                                                                 
    "type": "array",                                                            
    "items": {                                                                  
      "oneOf": [                                                                
        {                                                                       
          "type": "string",                                                     
          "description": "Identifier of child",
          "pattern": "^([A-Z0-9]-?){4}$"                                  
        },                                                                      
        {                                                                       
          "type": "object",                                                     
          "description": "Contains details about the child",
          "properties": {
            "age": {
              "type": "number"
            }
          }                    
        }                                                                       
      ]                                                                         
    }                                                                           
  },                                                                            
  "detailed": {                                                                 
    "type": "boolean",                                                          
    "description": "If true, children array contains extra details.",           
    "default": false                                                            
  },                                                                            
  "oneOf": [                                                                    
    {                                                                           
      "detailed": {                                                             
        "enum": [                                                               
          true                                                                  
        ]                                                                       
      },                                                                        
      "children": {                                                             
        "type": "array",                                                        
        "items": {                                                              
          "type": "object"                                                      
        }                                                                       
      }                                                                         
    },                                                                          
    {                                                                           
      "detailed": {                                                             
        "enum": [                                                               
          false                                                                 
        ]                                                                       
      },                                                                        
      "children": {                                                             
        "type": "array",                                                        
        "items": {                                                              
          "type": "string"                                                      
        }                                                                       
      }                                                                         
    }                                                                           
  ]                                                                             
}

第二个oneOf对响应对象提出了进一步的要求,当"detailed": true"孩子&#34}的项目类型时数组必须是" object"。这改进了第一个oneOf限制,该限制描述了" children"中对象的模式。阵列。