Python解析字典JSON筛选全局/项目Admin角色用户方法
筛选两类Admin角色用户的实现方案
核心判断逻辑:只要用户满足globalRole字段值为Admin、tprojectRole字段值为Admin两个条件任意一个,即可纳入结果集,不需要两个条件同时满足。
可直接复用的实现代码
做了字段缺失容错处理,避免异常数据导致脚本崩溃:
def filter_admin_users(user_list: list[dict]) -> list[dict]: admin_users = [] for user in user_list: # 字段不存在时默认返回空字符串,避免KeyError is_global_admin = user.get("globalRole", "") == "Admin" is_project_admin = user.get("tprojectRole", "") == "Admin" # 任意一个Admin角色满足条件即加入结果 if is_global_admin or is_project_admin: admin_users.append(user) return admin_users
如果偏好更简洁的写法,可以直接用列表推导式实现相同逻辑:
admin_users = [ user for user in user_list if user.get("globalRole", "") == "Admin" or user.get("tprojectRole", "") == "Admin" ]
3种场景验证样例
对应提到的三类用户结构做测试,测试数据如下:
test_users = [ # 场景1:仅全局角色为Admin {"userId": 1, "userName": "zhangsan", "globalRole": "Admin", "tprojectRole": "Viewer"}, # 场景2:仅项目角色为Admin {"userId": 2, "userName": "lisi", "globalRole": "Viewer", "tprojectRole": "Admin"}, # 场景3:全局+项目角色均为Admin {"userId": 3, "userName": "wangwu", "globalRole": "Admin", "tprojectRole": "Admin"}, # 普通用户,预期被过滤 {"userId": 4, "userName": "zhaoliu", "globalRole": "Viewer", "tprojectRole": "Viewer"} ] result = filter_admin_users(test_users)
预期输出
筛选完成后result的内容如下,完全覆盖三类符合要求的Admin用户,过滤掉普通用户:
[ {"userId": 1, "userName": "zhangsan", "globalRole": "Admin", "tprojectRole": "Viewer"}, {"userId": 2, "userName": "lisi", "globalRole": "Viewer", "tprojectRole": "Admin"}, {"userId": 3, "userName": "wangwu", "globalRole": "Admin", "tprojectRole": "Admin"} ]
常见代码逻辑问题修正
- 不要把判断条件的
or写成and:如果用and连接两个判断条件,只会筛选出双角色均为Admin的用户,漏掉仅单角色为Admin的符合要求的用户 - 不要用
user["globalRole"]这种硬索引的方式取值:如果某条用户数据缺失对应字段,会直接触发KeyError导致脚本中断,dict.get()方法的容错性更适合处理结构不完全固定的JSON解析结果 - 如果角色字段存在嵌套结构(比如嵌套在
roleInfo父字段下),把取值逻辑调整为逐层get即可:user.get("roleInfo", {}).get("globalRole", "") == "Admin",避免父级字段缺失时触发报错
内容的提问来源于stack exchange,提问作者ckmb
相关产品推荐
相关产品推荐

