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

如何在Python中验证含固定键与自定义键的JSON Schema

JSON Schema验证:固定键、自定义键及嵌套结构处理方案

需求说明

需要验证用户提交的JSON文件,要求:

  • 固定键(a、b、c、d)格式合规
  • 自定义键(如c下的custom_a、custom_b)的值必须符合指定格式(字典列表)
  • 处理嵌套结构:字典列表、包含字典列表的自定义键对象

示例JSON结构

{
    "a": "some value",
    "b": "some value",
    "c": {
        "custom_a": [{"key1": "val1"}, {"key2": "val2"}],
        "custom_b": [{"id": 1}, {"id": 2}]
    },
    "d": [{"name": "test"}, {"name": "demo"}]
}

之前的错误尝试

尝试1:语法错误的Schema定义

import json
from jsonschema import validate

my_json = json.loads(<符合上述结构的JSON字符串>) 

schema = {
    "a" : {"type": "string"},
    "b" : {"type": "string"},
    "c" : {[{}]},  # 语法错误,Schema必须是标准JSON结构
    "d": [{}]      # 同样错误,数组不能直接作为Schema值
}

validate(instance=my_json, schema=schema)  # 触发TypeError

问题:Schema定义不符合JSON Schema规范,不能直接用{[{}]}或[{}]表示类型,必须用标准的类型声明字段。

尝试2:未正确定义嵌套结构

schema = {
    "a" : {"type": "string"},
    "b" : {"type": "string"},
    "c" : {
        "Unsure what to define here": {"type": "list"}  # 错误:不能用具体键名匹配自定义键,且未定义列表元素结构
    },
    "d": {"type": "list"}  # 错误:仅声明类型为列表,但未定义列表内字典的结构
}

问题:无法匹配c下的任意自定义键,也未明确列表元素(字典)的验证规则。

正确解决方案

JSON Schema的核心是用标准关键字声明结构:

  • 用type: object定义对象,properties声明固定键的规则
  • 用type: array定义列表,items声明列表元素的结构
  • 用patternProperties匹配自定义键(支持正则匹配键名),additionalProperties限制自定义键的取值规则

完整验证代码

import json
from jsonschema import validate

# 示例JSON
sample_json = '''
{
    "a": "some value",
    "b": "some value",
    "c": {
        "custom_a": [{"key1": "val1"}, {"key2": "val2"}],
        "custom_b": [{"id": 1}, {"id": 2}]
    },
    "d": [{"name": "test"}, {"name": "demo"}]
}
'''
my_json = json.loads(sample_json)

# 定义Schema
schema = {
    "type": "object",
    "required": ["a", "b", "c", "d"],  # 指定必填的固定键
    "properties": {
        "a": {"type": "string"},
        "b": {"type": "string"},
        # 处理d字段:字典列表
        "d": {
            "type": "array",
            "items": {
                "type": "object",
                # 如果需要限制字典的键,可添加properties/required,否则留空表示任意字典
                "additionalProperties": True
            }
        },
        # 处理c字段:包含自定义键的对象,每个值是字典列表
        "c": {
            "type": "object",
            # 匹配所有自定义键(正则^.*$表示任意键名)
            "patternProperties": {
                "^.*$": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "additionalProperties": True  # 允许字典内任意键值,如需限制可添加规则
                    }
                }
            },
            # 禁止c字段出现非自定义的固定键(可选,根据需求调整)
            "additionalProperties": False
        }
    },
    # 禁止根对象出现额外的未声明键(可选)
    "additionalProperties": False
}

# 执行验证
validate(instance=my_json, schema=schema)

关键规则说明

  1. 固定键验证:通过properties声明每个固定键的类型(如a、b为字符串),required指定必须存在的键。
  2. 字典列表(d字段):用type: array声明列表,items里定义每个元素是object,可通过properties进一步限制字典的键值规则。
  3. 自定义键对象(c字段):
    • patternProperties:用正则匹配所有自定义键(^.*$匹配任意键名),并定义对应值的规则(字典列表)。
    • additionalProperties: False:确保c下只有符合规则的自定义键,禁止额外的未匹配键(按需开启)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 09:25:07