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

如何为含动态属性的嵌套对象映射创建JSON Schema

解决动态属性嵌套的JSON Schema定义问题

我正好处理过类似的场景,核心是利用JSON Schema的patternProperties或additionalProperties来约束动态属性的结构,同时通过required关键字确保必填字段存在。下面是针对你的需求一步步构建的完整Schema:

完整的JSON Schema

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": ["messages"],
  "properties": {
    "id": { "type": "string" },
    "messages": {
      "type": "object",
      // 如果你的动态属性有命名规律(比如都以book开头),用patternProperties匹配
      "patternProperties": {
        "^book.*": {
          "type": "object",
          "required": ["default"],
          "properties": {
            "default": {
              "type": "object",
              "required": ["channels"],
              "properties": {
                "channels": {
                  "type": "object",
                  // channels下的每个渠道(sqs/sns/s3等)都要符合这个结构
                  "additionalProperties": {
                    "type": "object",
                    "required": ["enabled", "topic", "shares"],
                    "properties": {
                      "enabled": { "type": "boolean" },
                      "topic": { "type": "string" },
                      "shares": { "type": "boolean" }
                    },
                    // 禁止渠道对象有额外的未定义属性(可选,根据需求调整)
                    "additionalProperties": false
                  }
                }
              },
              "additionalProperties": false
            }
          },
          "additionalProperties": false
        }
      },
      // 如果动态属性没有命名规律,就用additionalProperties替代patternProperties:
      // "additionalProperties": { ... 这里放上面^book.*对应的结构 ... },
      // 确保messages至少有一个动态属性(可选)
      "minProperties": 1
    }
  },
  "additionalProperties": false
}

关键部分解释

  1. 顶层结构优化:

    • 用required: ["messages"]替代你之前的anyOf写法,更直接地强制messages为必填字段。
    • 可选设置additionalProperties: false,防止顶层出现未定义的额外属性,保证结构严谨性。
  2. messages下的动态属性处理:

    • 若动态属性有命名规则(比如都以book开头),用patternProperties配合正则^book.*匹配所有符合规则的属性,确保每个属性都遵循统一结构。
    • 若属性名称无规律,直接用additionalProperties指定所有额外属性必须符合定义的结构,不管属性名是什么都会被约束。
  3. 动态属性内部必填项约束:

    • 每个动态属性对象必须包含default字段,通过required: ["default"]强制。
    • default对象必须包含channels字段,同样用required: ["channels"]约束。
  4. 渠道结构统一约束:

    • 用additionalProperties定义每个渠道(如sqs、sns)必须包含enabled(布尔型)、topic(字符串)、shares(布尔型)三个必填字段,确保所有渠道结构一致。
    • 可选设置additionalProperties: false,禁止渠道对象出现未定义属性,避免不符合预期的字段混入。

这个Schema完全能验证你提供的示例JSON,同时支持添加更多类似bookXXX的动态属性,只要每个属性的结构符合定义即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:07:32