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

Python中如何定义键为属性名、值为对应类型的字典以实现JSON校验?

Python JSON属性类型校验实现方案

基础实现(原生类型校验)

你要的属性-类型映射可以直接用Python内置类型作为字典的值,isinstance原生支持直接传入类型对象做判断,参考实现如下:

from typing import Dict

# 定义属性名到预期类型的映射字典,值直接填Python类型对象
property_type_map: Dict[str, type] = {
    "user_id": int,
    "username": str,
    "is_vip": bool,
    "balance": float
}

# 待校验的JSON数据(已通过json.loads解析为Python字典)
parsed_json = {
    "user_id": 1001,
    "username": "test_user",
    "is_vip": "yes", # 类型错误,预期是bool
    "balance": 99.5
}

# 校验逻辑
for prop_name, expected_type in property_type_map.items():
    # 先校验属性是否存在
    if prop_name not in parsed_json:
        print(f"校验失败:缺失必填属性【{prop_name}】")
        continue
    # 再校验值的类型
    prop_value = parsed_json[prop_name]
    if not isinstance(prop_value, expected_type):
        print(f"校验失败:属性【{prop_name}】类型错误,预期{expected_type.__name__},实际为{type(prop_value).__name__}")

进阶场景适配

支持多类型兼容

如果某个属性允许匹配多种类型,可以用typing.Union定义联合类型,isinstance原生支持该判断:

from typing import Dict, Union

property_type_map: Dict[str, Union[type, tuple[type, ...]]] = {
    # 手机号允许是数字或字符串类型
    "phone": Union[int, str],
    # Python 3.10+ 可简写为:
    # "phone": int | str
}

# 校验示例
print(isinstance(13800138000, property_type_map["phone"])) # 输出True
print(isinstance("13800138000", property_type_map["phone"])) # 输出True

自定义复杂校验规则

如果需要校验日期格式、数值范围等更复杂的规则,可以把字典的值改为校验函数,灵活性更高:

from typing import Dict, Callable, Any
from datetime import datetime

# 自定义日期格式校验函数
def validate_date_str(value: Any) -> bool:
    if not isinstance(value, str):
        return False
    try:
        datetime.strptime(value, "%Y-%m-%d %H:%M:%S")
        return True
    except ValueError:
        return False

# 映射字典的值改为校验函数,返回布尔值表示是否通过校验
property_validator_map: Dict[str, Callable[[Any], bool]] = {
    "register_time": validate_date_str,
    # 用lambda实现简单的范围校验
    "age": lambda x: isinstance(x, int) and 0 < x < 150
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:15:00