Json 对象的架构数组(其中对象必须相同)

Json schema array of objects (where objects must be the same)

试图创建一个 JSON 模式,无法弄清楚如何控制数组类型的对象包含必须以某种方式存在的子对象。问题是我不知道我会有多少个子对象。

太简单了,我有这个json:

{
  "Fuses":[
    {
        "Foo": 80
    },
    {
        "Foo": 20
    }
  ]
}

如果我为此生成一个模式,它要么硬编码将有两个包含“Foo”的子对象,要么我只留下一个:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "Fuses": {
      "type": "array",
      "items": [
        {
          "type": "object",
          "properties": {
            "Foo": {
              "type": "integer"
            }
          },
          "required": [
            "Foo"
          ]
        }
      ]
    }
  },
  "required": [
    "Fuses"
  ]
}

但这将是有效的,(我不想这样做):

{
  "Fuses":[
    {
        "Foo": 80
    },
    {
        "fooXYSCs": "whatever"
    }
  ]
}

我想允许 "Fuses" 在数组中拥有任意数量的子对象,但每个子对象都必须为 "Foo": integer(并且需要 obv)。

您的问题是您的架构描述了一个恰好包含一个元素的数组。

例如这个:

{
  "type": "array",
  "items": [
    { "const": 42 }
  ]
}

与此相同:

{
  "type": "array",
  "minItems": 1,
  "maxItems": 1,
  "items": [
    { "const": 42 }
  ]
}

这将验证这个并且只验证这个数组:[42]

如果您的数组可以包含零个或多个相同形状的元素,我会这样做:

{
  "type": "array",
  "items": {
    "const": 42
  }
}

这会验证 [][42][42, 42][42, 42, 42],...但不会验证 [42, 43] 例如。

所以要回答您的问题,您的架构应该是:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "Fuses": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "Foo": {
            "type": "integer"
          }
        },
        "required": [
          "Foo"
        ]
      }
    }
  },
  "required": [
    "Fuses"
  ]
}