json (schema) 说元素可以是单个项或数组是否有效

Is it valid json (schema) to say that an element can be a single item or an array

是否可以指定特定的 json 值可以是单个元素或数组?

例如根据给定的单个 json 模式,以下两个 json 文档是否有效。

"person": {
    "name": "john",
    "friends": "jack"
}

"person": {
    "name": "john",
    "friends": ["jack", "jill"]
}

当然有可能(我相信)如果你忽略模式的概念,并且只是在使用诸如 rapidjson 之类的解析器进行解析时简单地检查元素是否是数组之前正在阅读内容。

我想知道的是,如果我采用这种方法,如果我以后想为它指定一个json模式会不会有问题?

在 JSON 架构中,您可以指定项目必须匹配的 一个 类型,或者项目必须至少匹配一个类型的数组(加上其他一些可能性)。

所以是的,您可以有一个架构,表明 "friends" 值是一个字符串或一个字符串数组。

显然这意味着客户端代码和服务器代码需要区分这两种情况,并且针对每种情况使用不同的代码;您可能会考虑发送一个包含一个字符串的数组,而不是发送一个只有一个朋友的数组,以简化所有代码。

是的,JSON 模式可以使用 anyOfoneOf 关键字表达这一点。这些关键字指定一组模式。如果一个或多个模式有效,则 anyOf 有效。如果一个且只有一个模式有效,则 oneOf 有效。 anyOf 几乎总是足够的。

这是一个 JSON 模式,可以验证您的示例人物对象

{
  "type": "object",
  "properties": {
    "name": { "type": "string" }
    "friends": {
      "anyOf": [
        { "$ref": "#/definitions/friend" },
        {
          "type": "array",
          "items": { "$ref": "#/definitions/friend" }
        }
      ]
    }
  },
  "definitions": {
    "friend": { "type": "string" }
  }
}