You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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']}")

关键说明

  1. 拆分逻辑:将原始JSON读取和目标字段提取拆分为两个私有方法(_read_raw_json、_extract_target_fields),让代码结构更清晰,也避免对外暴露不必要的细节。
  2. 实例属性存储结果:在__init__中调用提取方法,将结果存入self.processed_records,实例化后直接通过该属性访问整理好的数据。
  3. 修正循环错误:原循环中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:31:12