上一篇
2025年8月,Fastjson等主流JSON解析库被曝存在远程代码执行漏洞,攻击者可利用未过滤的@type
字段构造恶意类实现服务器接管。建议立即升级库版本至安全补丁版,并在处理不可信数据时禁用自动类型反序列化功能。
TIOBE 8月编程语言排行榜显示,Python以26.14%的市场份额稳居榜首,其简洁的JSON处理能力(如内置json
模块)成为数据集成领域的首选语言,今天我们就来拆解:如何用Python高效、安全地从JSON文件提取数据并返回值?
import json from pathlib import Path # 推荐使用Pathlib处理路径
def load_json(file_path: str) -> dict: try: with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) # 自动将JSON转为Python字典/列表 return data except FileNotFoundError: print(f"🚨 文件未找到:{file_path}") except json.JSONDecodeError: print("🚨 JSON格式错误!请检查文件内容")
# 示例JSON结构 sample_data = { "users": [ {"id": 1, "name": "Alice", "skills": ["Python", "SQL"]}, {"id": 2, "name": "Bob", "skills": ["Java", "C++"]} ] } # 验证关键字段是否存在 if "users" in data and isinstance(data["users"], list): print("✅ 数据结构正常") else: raise ValueError("🚨 数据结构不符合预期")
# 提取第一个用户的技能列表 first_user_skills = data["users"][0]["skills"] print(f"📌 用户1技能:{first_user_skills}") # 输出:['Python', 'SQL']
# 筛选所有会Python的用户 python_users = [ user for user in data["users"] if "Python" in user.get("skills", []) ] print(f"🎯 会Python的用户:{python_users}") # 输出:[{'id': 1, 'name': 'Alice', 'skills': ['Python', 'SQL']}]
# 安全获取可能缺失的字段 city = data.get("address", {}).get("city", "未知城市") print(f"🏙️ 城市:{city}") # 输出:未知城市(如果address字段不存在)
from typing import NamedTuple class User(NamedTuple): id: int name: str skills: list[str] def parse_users(data: dict) -> list[User]: return [ User( id=user["id"], name=user["name"], skills=user["skills"] ) for user in data["users"] ] users = parse_users(data) print(users[0].skills) # 输出:['Python', 'SQL']
import pandas as pd def json_to_df(data: dict) -> pd.DataFrame: return pd.json_normalize(data["users"]) df = json_to_df(data) print(df.head()) # 输出: # id name skills # 0 1 Alice [Python, SQL] # 1 2 Bob [Java, C++]
# 使用json.loads时设置strict=False(Python 3.11+) raw_data = '{"@type": "com.example.MaliciousClass"}' safe_data = json.loads(raw_data, strict=False) # 禁用特殊类型解析
ALLOWED_KEYS = {"users", "id", "name", "skills"} def sanitize_data(input_data: dict) -> dict: return {k: v for k, v in input_data.items() if k in ALLOWED_KEYS} clean_data = sanitize_data(data)
import requests def fetch_data_from_api(url: str) -> dict: response = requests.get(url) response.raise_for_status() # 自动抛出HTTP错误 return response.json() # 直接解析为字典 api_data = fetch_data_from_api("https://api.example.com/users")
get()
代替直接访问键,避免KeyError isinstance()
确认数据类型 ijson
库流式解析 💡 彩蛋工具推荐:
现在就去试试用这些技巧处理你的下一个JSON项目吧!🚀
本文由 业务大全 于2025-08-15发表在【云服务器提供商】,文中图片由(业务大全)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/622585.html
发表评论