pd.json_normalize规范化API返回JSON报错解决方法
错误原因
抛出NotImplementedError是两个写法问题导致的:
- 传入了错误的输入类型:
requests.Response.json()已经将接口返回的JSON解析为Python原生字典,额外调用json.dumps()会把字典重新序列化为字符串,而pd.json_normalize()仅支持接收解析完成的字典、列表类结构化对象,不支持字符串输入。 - 未指定嵌套记录的展开路径:该JSON顶层分为两部分,
header是单组全局元数据对象,entity是存储车辆位置记录的数组。不传入record_path参数时,函数无法定位需要展开为多行数据的目标数组,无法完成转换逻辑。
正确实现代码
不需要做序列化/反序列化的多余操作,直接使用接口返回的解析后字典,通过参数指定展开路径和需要附加的元数据即可:
import pandas as pd import requests # 拉取并解析接口数据 resp = requests.get('https://app.mecatran.com/utw/ws/gtfsfeed/vehicles/valleymetro?apiKey=4f22263f69671d7f49726c3011333e527368211f&asJson=true') raw_data = resp.json() # 结构化规范化 df = pd.json_normalize( data=raw_data, record_path="entity", # 指定要展开为行记录的数组路径 meta=[ # 指定需要附加到每一行的全局元数据路径 ["header", "gtfsRealtimeVersion"], ["header", "incrementality"], ["header", "timestamp"] ], sep="_" # 嵌套字段的列名分隔符,默认即为下划线 )
补充说明
- 上述代码会自动将
entity下所有层级的嵌套字段(如vehicle.trip.tripId、vehicle.position.latitude)打平为独立列,同时每一行都会携带顶层header中的全局元数据字段,无需手动拆分合并。
如果不需要保留全局元数据,直接传入
raw_data["entity"]调用pd.json_normalize()即可,这就是你之前测试可正常运行的写法,逻辑与上述实现一致,仅省略了附加元数据的步骤。
内容的提问来源于stack exchange,提问作者Derek Lee
相关产品推荐
相关产品推荐

