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

动态展平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())

关键修改说明

  1. 处理目标调整:原函数接收整个数组作为输入,现在改为接收单个记录(字典),确保每条记录被独立展平。
  2. 批量遍历处理:通过列表推导式遍历原始数组,对每一条记录调用展平函数,生成包含所有独立展平记录的列表。
  3. 类型判断优化:用isinstance替代type(x) is,类型判断更灵活,支持子类场景。

通用扩展提示

如果你的JSON存在嵌套数组(比如单条记录包含多个子项),可以在flatten函数的列表处理分支调整逻辑:

  • 若要将嵌套数组展开为多行,需要修改函数返回结构(比如返回字典列表而非单个字典)。
  • 若要保留嵌套结构的索引(如items_0_name格式),当前实现已支持该逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:35:28