如何修改Python类的JSON读取方法,仅返回指定的日期与数值字段?
问题
我基于JSON文件编写代码,允许用户在程序开始时选择文件,最初的函数式代码如下:
file_name = input("Which .json file do you want to open? ") def read_json_file(file_name): with open(file_name) as json_file: weather = js.load(json_file) return weather
之后改用类重构优化结构,得到代码:
class Weather_data: def __init__(self): self.file_name = input("Which .json file do you want to open? ") def read_json_file(self): with open(self.file_name) as json_file: weather = js.load(json_file) return weather
现在希望该类的读取逻辑不返回整个JSON内容,而是仅提取并返回特定字段(如原循环中的date和value),且能通过自定义类直接访问这些数据,该如何实现?
原提取逻辑的循环代码:
for i in range(len(weather['date'])): date = weather['value'][i]['date'] value = weather['value'][i]['value']
解决方案
可以通过以下方式修改类,将数据提取逻辑整合进去,同时把处理后的结果作为实例属性供外部访问:
修改后的类代码
import json as js class Weather_data: def __init__(self): self.file_name = input("Which .json file do you want to open? ") # 初始化时自动完成数据读取与提取 self.processed_records = self._extract_target_fields() def _read_raw_json(self): # 私有方法:负责读取完整JSON内容 with open(self.file_name) as json_file: return js.load(json_file) def _extract_target_fields(self): # 私有方法:提取需要的date和value字段 raw_data = self._read_raw_json() target_records = [] # 修正原循环的逻辑错误:遍历raw_data['value']而非raw_data['date'] for item in raw_data['value']: target_records.append({ 'date': item['date'], 'value': item['value'] }) return target_records # 使用示例 weather_obj = Weather_data() # 直接访问处理后的记录 print("提取到的天气数据:") for record in weather_obj.processed_records: print(f"日期: {record['date']}, 数值: {record['value']}")
关键说明
- 拆分逻辑:将原始JSON读取和目标字段提取拆分为两个私有方法(
_read_raw_json、_extract_target_fields),让代码结构更清晰,也避免对外暴露不必要的细节。 - 实例属性存储结果:在
__init__中调用提取方法,将结果存入self.processed_records,实例化后直接通过该属性访问整理好的数据。 - 修正循环错误:原循环中
range(len(weather['date']))存在逻辑问题,实际应该遍历raw_data['value']列表中的每一项,这样才能正确获取每个item的date和value。
如果希望延迟数据处理(比如用户手动触发提取),也可以将提取逻辑改为公开方法:
class Weather_data: def __init__(self): self.file_name = input("Which .json file do you want to open? ") self.processed_records = None def _read_raw_json(self): with open(self.file_name) as json_file: return js.load(json_file) def get_processed_records(self): if not self.processed_records: raw_data = self._read_raw_json() self.processed_records = [] for item in raw_data['value']: self.processed_records.append({ 'date': item['date'], 'value': item['value'] }) return self.processed_records # 使用示例 weather_obj = Weather_data() records = weather_obj.get_processed_records() for record in records: print(f"日期: {record['date']}, 数值: {record['value']}")
内容的提问来源于stack exchange,提问作者ilra
相关产品推荐
相关产品推荐

