动态展平API返回JSON仅得单行结果,求通用解析方案
解决动态展平JSON返回单行结果的问题
你的问题出在当前的展平函数把整个JSON数组(所有记录)合并成了单个字典,所以用pd.json_normalize处理后只会得到单行数据。要得到多行结果,需要对数组中的每一条记录单独展平,再将所有展平后的字典组合成列表,最后转成DataFrame。
修改后的实现代码
import requests import pandas as pd def flatten_json(obj): out = {} def flatten(x, prefix=''): if isinstance(x, dict): for key, value in x.items(): flatten(value, prefix + key + '_') elif isinstance(x, list): # 若遇到嵌套列表,可根据需求调整逻辑,比如保留索引或展开为多行 for idx, item in enumerate(x): flatten(item, prefix + str(idx) + '_') else: # 移除最后多余的下划线 out[prefix[:-1]] = x flatten(obj) return out # 获取API数据 URL='https://data.calgary.ca/resource/848s-4m4z.json' data = requests.get(URL).json() # 逐个展平每条记录,生成展平后的字典列表 flattened_records = [flatten_json(record) for record in data] # 转换为多行DataFrame df = pd.DataFrame(flattened_records) print(df.head())
关键修改说明
- 处理目标调整:原函数接收整个数组作为输入,现在改为接收单个记录(字典),确保每条记录被独立展平。
- 批量遍历处理:通过列表推导式遍历原始数组,对每一条记录调用展平函数,生成包含所有独立展平记录的列表。
- 类型判断优化:用
isinstance替代type(x) is,类型判断更灵活,支持子类场景。
通用扩展提示
如果你的JSON存在嵌套数组(比如单条记录包含多个子项),可以在flatten函数的列表处理分支调整逻辑:
- 若要将嵌套数组展开为多行,需要修改函数返回结构(比如返回字典列表而非单个字典)。
- 若要保留嵌套结构的索引(如
items_0_name格式),当前实现已支持该逻辑。
内容的提问来源于stack exchange,提问作者gabidoye
相关产品推荐
相关产品推荐

