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

Python遍历含同名键的JSON提取指定字段报错及实现方法

解决JSON嵌套数据提取与"unhashable type: 'dict'"错误问题

问题分析

你遇到的错误是因为处理嵌套字典/数组时,将不可哈希的字典对象用于了pandas要求可哈希的操作场景(比如列名、索引,或错误的展开逻辑)。要实现每个results对象对应description数量的记录,核心是把嵌套数组扁平化,让上层字段和数组内的每个元素一一配对。

解决方案

方法1:手动遍历生成扁平化记录

这种方式灵活性高,适配复杂嵌套结构:

import pandas as pd
import json

# 加载JSON数据(根据实际来源调整,比如从API响应获取)
with open('your_data.json', 'r') as f:
    raw_data = json.load(f)

flat_records = []
# 遍历每个results对象
for item in raw_data['results']:
    # 提取固定字段
    base_info = {
        'expenses': item.get('expenses'),
        'dt_posted': item.get('dt_posted')
    }
    # 遍历lobbying_activities数组,生成对应记录
    for activity in item.get('lobbying_activities', []):
        record = base_info.copy()
        record['description'] = activity.get('description')
        flat_records.append(record)

# 转换为目标数据集
final_df = pd.DataFrame(flat_records)

方法2:用pandas.json_normalize快速处理

pandas内置的json_normalize专门用于嵌套JSON的扁平化,代码更简洁:

import pandas as pd
import json

# 加载JSON数据
with open('your_data.json', 'r') as f:
    raw_data = json.load(f)

# 直接展开嵌套数组并关联上层字段
final_df = pd.json_normalize(
    raw_data['results'],
    record_path='lobbying_activities',  # 指定要展开的数组路径
    meta=['expenses', 'dt_posted'],     # 指定要保留的上层字段
    record_prefix='activity_'           # 数组内字段的前缀(可选)
)

# 按需重命名description列
final_df = final_df.rename(columns={'activity_description': 'description'})

关键说明

  • 两种方法都会生成每条记录对应一个description的数据集,完全匹配需求。
  • 避免错误的核心是不要直接将嵌套字典/数组作为pandas的列值或索引,先将结构扁平化,确保每个字段都是字符串、数字这类可哈希的基础类型。

内容的提问来源于stack exchange,提问作者kiestuthridge23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:45:27