2015-10-06 92 views
3

我有这个模式。它检查评论,目前工作正常。JSON模式 - 多种类型

var schema = { 
    id: '', 
    type: 'object', 
    additionalProperties: false, 
    properties: { 
    text: { 
     type: 'string', 
     minLength: 1, 
     required: true 
    }, 
    author: { 
     type: 'number', 
     required: true 
    } 
    } 
}; 

我的评论的结构是:

{ 
    text: "Hello world!", 
    author: 1 
} 

但现在,我需要验证这样的对象的数组。所以,我可以得到的东西,如:

[ 
    { 
     text: "Hello world! Im comment #1", 
     author: 1 
    }, 
    { 
     text: "Super awesome comment #2!", 
     author: 0 
    } 
    ] 

有时我得到一个评论仅所以我得到一个对象,并需要使用第一个模式,但有时我得到的意见数组,我的模式不适合。

我听说过json架构anyOf,但我不知道该怎么做。

有些人喜欢:

anyOf 
    schema-1 (object) 
    schema-2 (array with objects) 

任何帮助吗?

谢谢。

回答

3

的解决方案是在一个地方的共同定义,然后引用通用的定义从两个不同的选项里面oneOf

在这里,我们把简单对象定义中definitions

{ 
    "definitions": { 
     "singleObject": { 
      ... same definition as in your question ... 
     } 
    } 
} 

我们再引用此架构,内部oneOf

{ 
    "oneOf": [ 
     {"$ref": "#/definitions/singleObject"}, // plain object 
     { 
      "type": "array", // array of plain objects 
      "items": {"$ref": "#/definitions/singleObject"} 
     } 
    ], 
    "definitions": { 
     "singleObject": {...} 
    } 
} 

您CA n以几种不同的方式组织这种方式 - 我个人通常最终将简单对象定义作为根模式,并且在definitions中有单个/阵列切换器,所以我的文档的模式实际上是http://example.com/schema#/definitions/arrayOrSingle

+0

谢谢,它的工作原理。为什么不'''anyOf'''而不是'''oneOf'''? – jBaumann

+1

在这种情况下,它们会有点相似,因为它不能同时是一个对象和一个数组。但是,一般情况下,除非您明确希望它们都可以同时使用,否则使用'oneOf'同样容易阅读,并且对预期行为更加明确。 – cloudfeet