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
相关产品推荐
相关产品推荐

