如何将列表中的嵌套JSON字段解析为DataFrame?
批量解析嵌套JSON到DataFrame的错误排查与解决
问题背景
你通过API批量获取订单的嵌套JSON响应并存入列表,单个JSON能正常用json.loads()+pd.json_normalize()解析成DataFrame,但批量处理时却遇到两个错误:
AttributeError: 'unicode' object has no attribute 'itervalues'- 部分请求出现
ValueError: No JSON object could be decoded
先看你出错的批量处理代码:
for x in lists: order_detail = json.loads(x) order_detail = json_normalize(x) # 这里是错误根源! print(order_detail)
错误原因分析
1. AttributeError的直接原因
你在循环里犯了一个小疏忽:把未解析的字符串x传给了json_normalize,而不是解析后的字典对象!
单个处理时你是先json.loads(r.text)得到字典,再传给json_normalize;但批量循环里,你虽然写了json.loads(x),但后面却用了原始的x(字符串)去调用json_normalize,而json_normalize接收的是字典/可迭代对象,不是字符串,自然会抛出属性错误。
2. ValueError的原因
这个错误说明列表里的某些元素不是有效的JSON字符串,大概率是API请求失败导致的:比如订单ID不存在返回404页面文本、服务器错误返回500页面、网络波动导致响应不完整,这些内容都不是合法JSON,所以json.loads解析失败。
完整解决代码
下面是修复后的批量处理代码,同时加入了异常处理来捕获请求和解析错误:
import pandas as pd import json import requests # 初始化空列表,用来存储每个订单的DataFrame order_dataframes = [] for order_id in df.id: try: # 发送API请求 response = requests.get(f"URL/v1/orders/{order_id}", headers=headers_order) # 先检查请求是否成功(比如4xx/5xx状态码会抛出异常) response.raise_for_status() # 解析JSON响应为字典 order_dict = json.loads(response.text) # 归一化嵌套JSON到DataFrame single_order_df = pd.json_normalize(order_dict) # 将单个订单的DataFrame加入列表 order_dataframes.append(single_order_df) except requests.exceptions.HTTPError as http_err: print(f"请求订单ID {order_id} 失败: {http_err}") except json.JSONDecodeError as json_err: print(f"解析订单ID {order_id} 的JSON失败: {json_err},响应内容预览: {response.text[:100]}...") except Exception as err: print(f"处理订单ID {order_id} 时发生未知错误: {err}") # 合并所有单个订单的DataFrame为一个大的DataFrame final_order_df = pd.concat(order_dataframes, ignore_index=True)
关键修复点
- 确保传给
pd.json_normalize的是解析后的字典对象(也就是上面代码里的order_dict),而不是原始的字符串 - 加入
response.raise_for_status()来检查API请求是否成功,避免把错误响应的文本当成JSON解析 - 异常处理能帮你跳过有问题的订单,同时记录错误信息,方便后续排查
内容的提问来源于stack exchange,提问作者RustyShackleford
相关产品推荐
相关产品推荐

