JSON 模式 - 多种类型

jBa*_*ann 6 json jsonschema

我有这个架构。它检查评论,目前工作正常。

var schema = {
  id: '',
  type: 'object',
  additionalProperties: false,
  properties: {
    text: {
      type: 'string',
      minLength: 1,
      required: true
    },
    author: {
      type: 'number',
      required: true
    }
  }
}; 
Run Code Online (Sandbox Code Playgroud)

我的评论结构是:

{
  text: "Hello world!",
  author: 1
}
Run Code Online (Sandbox Code Playgroud)

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

  [
    {
      text: "Hello world! Im comment #1",
      author: 1
    },
    {
      text: "Super awesome comment #2!",
      author: 0
    }
  ]
Run Code Online (Sandbox Code Playgroud)

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

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

有些人喜欢:

anyOf  
   schema-1 (object)
   schema-2 (array with objects)
Run Code Online (Sandbox Code Playgroud)

有什么帮助吗?

谢谢。

clo*_*eet 8

解决方案是在一个地方有一个通用定义,然后从内部的两个不同选项中引用该通用定义oneOf

在这里,我们将简单的对象定义放在里面definitions

{
    "definitions": {
        "singleObject": {
            ... same definition as in your question ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我们在里面引用这个模式oneOf

{
    "oneOf": [
        {"$ref": "#/definitions/singleObject"}, // plain object
        {
            "type": "array", // array of plain objects
            "items": {"$ref": "#/definitions/singleObject"}
        }
    ],
    "definitions": {
        "singleObject": {...}
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以组织这几个不同的方式-我个人经常结束与简单对象定义为根架构,并且具有在单/阵列切换器definitions,所以对于我的文档的架构实际上是http://example.com/schema#/definitions/arrayOrSingle