关于使用变量解析JSON及传入.ini中json_tree值的技术问询
解答你的JSON解析与参数传入问题
1. 能否使用类似['time']['updated']的变量来解析JSON?
当然可以,但直接把这个字符串当变量用不行——你得先把这个路径字符串转换成实际的字典键访问操作。举个Python的实际例子:
假设你已经把JSON解析成了字典data,可以写个小工具函数来处理这种路径字符串:
def fetch_nested_value(data, path_str): # 把路径字符串拆成单独的键列表 keys = [key.strip("'[]") for key in path_str.split('][')] current_layer = data for key in keys: current_layer = current_layer[key] return current_layer # 测试一下 sample_data = {"time": {"updated": "2024-05-20"}} target_path = "['time']['updated']" print(fetch_nested_value(sample_data, target_path)) # 输出: 2024-05-20
其他语言思路类似:先解析路径字符串得到键的序列,再逐层访问JSON对象。
2. 能否将json_tree作为参数传入类中?
绝对没问题!不管json_tree是解析后的JSON对象、还是刚才那种路径字符串,都能在实例化类的时候传进去,或者通过类的方法传入。比如这样写Python类:
class JSONHandler: def __init__(self, json_tree): self.tree = json_tree # 把传入的json_tree存为实例属性 def get_target_value(self, path_str=None): # 如果tree是原始JSON数据,就用路径取数;如果本身就是路径,可结合外部数据处理 if isinstance(self.tree, dict): if not path_str: return self.tree keys = [key.strip("'[]") for key in path_str.split('][')] current = self.tree for key in keys: current = current[key] return current elif isinstance(self.tree, str): # 这里可以结合你的原始JSON数据来取值,比如传入raw_data参数 pass # 使用示例 raw_data = {"time": {"updated": "2024-05-20"}} handler = JSONHandler(json_tree=raw_data) print(handler.get_target_value("['time']['updated']")) # 输出对应值
怎么传完全取决于你的类需要什么类型的参数,灵活调整就行。
3. 从.ini文件取多个json_tree值之一传入类的方案可行性与替代方案
这个方案完全可行,具体步骤可以这么走:
可行的实现步骤
- 用配置文件库读取.ini文件(以Python的
configparser为例):import configparser config = configparser.ConfigParser() config.read('your_config.ini') # 假设你的.ini文件结构是这样的: # [JSON_SETTINGS] # user_profile_path = ['user']['profile']['name'] # update_time_path = ['time']['updated'] # stats_count_path = ['data']['stats']['total'] # 取出你需要的那个路径值 selected_path = config.get('JSON_SETTINGS', 'update_time_path') - 把取出的
selected_path传入你的类就行——如果类需要路径字符串,直接传;如果类需要解析后的JSON片段,就先用上面的fetch_nested_value函数把对应值取出来再传。
万一遇到问题的替代方案
如果因为路径格式复杂、或者ini解析有异常,这些思路可以试试:
- 改用点分隔的路径格式:把.ini里的路径改成
time.updated,处理起来更简单,拆分的时候直接用keys = path_str.split('.')就行 - 存成列表格式的字符串:在.ini里写
["time", "updated"],读取后用ast.literal_eval()直接转换成列表,省去字符串拆分的麻烦:import ast path_str = config.get('JSON_SETTINGS', 'update_time_path') keys = ast.literal_eval(path_str) # 直接得到['time', 'updated'] - 用映射表代替直接存路径:在代码里定义一个字典,把ini里的简单键对应到实际路径列表,比如ini里写
update_time = time_updated,代码里path_mapping = {'time_updated': ['time', 'updated']},这样更安全,避免字符串解析出错。
内容的提问来源于stack exchange,提问作者j-grimwood
相关产品推荐
相关产品推荐

