You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JSON Schema验证数组中所有对象的指定字段值完全相同?

问题

给定如下JSON Schema:

{
    "type": "array",
    "items": {
      "type": "object",
      "properties": {
        "name": { "enum": ["Adam", "Daniel", "Mike"] },
        "desc": { "type": ["string", "null"] }
      },
      "required": [
        "name"
      ]
    }
}

能否验证数组中所有对象的name字段值完全相同?

示例:

  • 有效示例1:
[
  {"name": "Adam"},
  {"name": "Adam", "desc": "good"},
]
  • 有效示例2:
[
  {"name": "Mike"},
  {"name": "Mike", "desc": "good"},
]
  • 无效示例:
[
  {"name": "Adam"},
  {"name": "Adam", "desc": "good"},
  {"name": "Mike", "desc": "bad"},
]
当然可以实现,给你两种可行方案:

方案1:用$data关键字(推荐)

这种方法需要你的JSON Schema解析器支持Draft 7及以上版本,能直接让数组里所有元素的name和第一个元素的name保持一致:

{
  "type": "array",
  "minItems": 1,
  "items": {
    "type": "object",
    "properties": {
      "name": {
        "enum": ["Adam", "Daniel", "Mike"],
        "$data": "0/name"
      },
      "desc": { "type": ["string", "null"] }
    },
    "required": ["name"]
  }
}
  • $data": "0/name" 意思是当前元素的name必须和数组第一个元素(索引0)的name值完全一致
  • minItems: 1是为了避免空数组的情况,毕竟空数组里没有第一个元素可参照

方案2:兼容不支持$data的解析器

如果你的解析器不支持$data,可以用contains加allOf的组合来实现:

{
  "type": "array",
  "minItems": 1,
  "contains": {
    "properties": {
      "name": { "enum": ["Adam", "Daniel", "Mike"] }
    }
  },
  "items": {
    "type": "object",
    "properties": {
      "name": { "enum": ["Adam", "Daniel", "Mike"] },
      "desc": { "type": ["string", "null"] }
    },
    "required": ["name"],
    "allOf": [
      { "$ref": "#/contains" }
    ]
  }
}
  • contains先定义数组里存在某个符合name枚举值的元素
  • 然后items里的allOf引用这个规则,强制所有元素的name都和这个被定义的name保持一致

这两种方案都能满足需求,确保数组内所有对象的name字段值完全相同。

内容的提问来源于stack exchange,提问作者Andrei Khotko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:15:03