Python解析JSON数据全攻略:从基础到进阶实战
在数据驱动的时代JSON已成为前后端交互的通用语言。作为Python开发者掌握JSON解析技能是必备生存技能。本文将通过5个递进式案例带你彻底掌握Python内置的json模块并揭示高效处理JSON的10个核心技巧。基础解析从字符串到对象python1import json 2 3# 基础JSON字符串解析 4json_str {name: 张三, age: 25, married: false} 5data json.loads(json_str) 6print(data[name]) # 输出张三 7 8# 复杂嵌套结构解析 9nested_str 10{ 11 users: [ 12 {id: 1, skills: [Python, SQL]}, 13 {id: 2, skills: [Java, Go]} 14 ] 15} 16 17nested_data json.loads(nested_str) 18print(nested_data[users][1][skills][0]) # 输出Java 19文件操作大文件处理最佳实践python1# 读取大JSON文件流式解析 2import json 3 4def parse_large_json(file_path): 5 with open(file_path, r, encodingutf-8) as f: 6 for line in f: 7 if line.strip(): 8 yield json.loads(line) 9 10# 示例处理100万条记录的JSON文件 11for chunk in parse_large_json(big_data.json): 12 process(chunk) # 自定义处理函数 13序列化进阶自定义对象处理python1# 自定义对象序列化 2class User: 3 def __init__(self, name, age): 4 self.name name 5 self.age age 6 7# 方案1使用default参数 8def user_serializer(obj): 9 if isinstance(obj, User): 10 return {__User__: [obj.name, obj.age]} 11 raise TypeError(Object of type {} is not JSON serializable.format(type(obj))) 12 13json_str json.dumps(User(李四, 30), defaultuser_serializer) 14 15# 方案2继承JSONEncoder 16from json import JSONEncoder 17class CustomEncoder(JSONEncoder): 18 def default(self, obj): 19 if isinstance(obj, User): 20 return {name: obj.name, age: obj.age} 21 return super().default(obj) 22 23json_str json.dumps(User(王五, 28), clsCustomEncoder) 24实战案例API数据解析python1import requests 2import json 3 4def fetch_github_users(username): 5 url fhttps://api.github.com/users/{username} 6 response requests.get(url) 7 8 try: 9 user_data json.loads(response.text) 10 return { 11 name: user_data[name], 12 followers: user_data[followers], 13 repos: user_data[public_repos] 14 } 15 except json.JSONDecodeError as e: 16 print(fJSON解析错误: {e}) 17 return None 18 19print(fetch_github_users(octocat)) 20高级技巧与避坑指南日期处理自定义序列化/反序列化日期对象python1from datetime import datetime 2 3def date_parser(dct): 4 for k, v in dct.items(): 5 if isinstance(v, str) and len(v) 10: # YYYY-MM-DD格式 6 try: 7 dct[k] datetime.strptime(v, %Y-%m-%d) 8 except ValueError: 9 pass 10 return dct 11 12data json.loads({created_at: 2023-01-01}, object_hookdate_parser) 13大数处理使用parse_float和parse_intpython1import decimal 2 3data json.loads({price: 19.99}, parse_floatdecimal.Decimal) 4print(type(data[price])) # 输出class decimal.Decimal 5键排序美化输出时保持键顺序python1data {b: 2, a: 1} 2pretty_json json.dumps(data, sort_keysTrue, indent4) 3print(pretty_json) 4中文编码解决中文乱码问题python1json_str json.dumps({城市: 北京}, ensure_asciiFalse) 2print(json_str) # 输出{城市: 北京} 3性能优化百万级数据测试python1# 测试不同解析方式的性能差异 2import timeit 3 4large_json {data: [ ,.join([{id:%d} % i for i in range(1000000)]) ] 5 6# 测试1直接加载 7time_direct timeit.timeit(lambda: json.loads(large_json), number3) 8 9# 测试2使用object_hook 10def custom_hook(d): 11 return d 12 13time_hook timeit.timeit(lambda: json.loads(large_json, object_hookcustom_hook), number3) 14 15print(f直接加载耗时: {time_direct:.2f}秒) 16print(f带hook加载耗时: {time_hook:.2f}秒) 17总结与最佳实践优先使用内置模块json模块性能优异且经过充分测试异常处理始终捕获JSONDecodeError大文件处理使用流式解析避免内存溢出日期处理自定义解析器处理特殊格式源码分享网https://svipm.com.cn描述上千款各行各业的源码安全性反序列化时验证数据结构防止注入攻击通过本文的5个递进案例和10个核心技巧你已掌握从基础解析到高级定制的完整JSON处理技能。立即将这些技巧应用到实际项目中让你的Python数据处理效率提升300%