是否有效的json(架构)可以说元素可以是单个项目或数组

时间:2016-01-06 11:39:22

标签: json jsonschema rapidjson

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

E.g。根据给定的单个json模式,以下两个json文档都可以有效。

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

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

如果你忽略了schema的概念,并且只是在使用诸如rapidjson之类的解析器进行解析时,在读取内容之前简单地检查元素是否是数组,那么肯定是可能的(我相信)。

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

2 个答案:

答案 0 :(得分:2)

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

所以是的,你可以有一个模式,说“friends”值是一个字符串,或一个字符串数组。

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

答案 1 :(得分:1)

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

这是一个JSON Schema,它将验证您的示例人物对象

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